- 编写高质量代码:改善C程序代码的125个建议
- 马伟 著
- 473字
- 2025-03-16 17:14:06
建议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中的报错信息为“无法指定多个存储类”。