《编写高质量代码:改善c程序代码的125个建议》——建议6-2:小心使用typedef带来的陷阱

简介:

本节书摘来自华章计算机《编写高质量代码:改善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中的报错信息为“无法指定多个存储类”。

相关文章
|
存储 C语言
《编写高质量代码:改善c程序代码的125个建议》—— 导读
众所周知,C语言是一门既具有高级语言特点,又有汇编语言特点的通用计算机编程语言,无论是操作系统(如Microsoft Windows、Mac OS X、Linux和UNIX等)、嵌入式系统与普通应用软件,还是目前流行的移动智能设备开发,随处都可以看见它依然矫健的身影。
1884 0
下一篇
无影云桌面