本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第1章,建议6-2,作者:马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
建议6-2:小心使用typedef带来的陷阱
接下来看一个简单的typedef使用示例,如下面的代码所示:
typedef char* PCHAR;
int strcmp(const PCHAR, const PCHAR);
在上面的代码中,“const PCHAR”是否相当于“const char *”呢?
答案是否定的,原因很简单,typedef是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。因此,“const PCHAR”中的const给予了整个指针本身常量性,也就是形成了常量指针“char const(一个指向 char 的常量指针)”。即它实际上相当于“char const”,而不是“const char (指向常量 char 的指针)”。当然,要想让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;
不可行的原因是不能声明多个存储类关键字,由于typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static或任何其他存储类关键字了。当然,编译器也会报错,如在VC++ 2010中的报错信息为“无法指定多个存储类”。