20170726 --iRanMan
我们知道在C语言中使用关键词typedef能带来很大的好处,但是有些时候这也会带来一些差错,本文主要讲使用typedef带来的陷阱。
看一个简单的typedef使用实例,如下:
typedef char* PCHAR; //定义类型char*为PCHAR
int strcmp(const PCHAR, const PCHAR);
代码中的”const PCHAR”是否等价于”const char*” (一个指向常量char的指针)呢?
不是。
typedef是用来定义一种类型的新别名,不同于宏,不是简单的字符串替换。所以”const PCHAR”中的const给予了整个指针本身常量性,即形成了指向char的常量指针,”char* const”……是不是好拗口?多思考。
说白了,就是char* 是个整体,const 是针对char*,而不是char,相当于”char* const”
如果想要让”const PCHAR”等价于”const char*”,如下:
typedef const char* PCHAR;
int strcmp(PCHAR,PCHAR);
其实,无论什么时候,只要为指针声明typedef,就应该在最终的typedef名称中加上const,使得该指针本身就是常量。
需要特别注意的是,虽然typedef不影响对象的存储特性,但在语法上它是存储类的关键字,如auto, extern, static和register等,而一条指令中不能同时声明多个存储类关键字,所以typedef static int INT_STATIC
是不可行的。