在 typede f和宏文本替换之间存在一个关键性的区别。正确思考这个问题的方法就是把typedef 看成是一种彻底“封装”类型——在声明它之后不能再往里面增加别的东西。它和宏的区别体现在两个方面。
区别一:
首先,可以用其它类型说明符对宏类型名进行扩展,但对 typedef 所定义的类型名却不能这样做。如下所示:
区别二:
其次, 在连续几个变量的声明中,用 typedef 定义的类型能够保证声明中所有的变量均为同一种类型,而用#define定义的类型则无法保证。如下所示:
经过宏扩展,第二行变为:
这使得 chalk 和 cheese 成为不同的类型,就好像是辣椒酱和细香葱的区别;chalk 是一个指向 int 的指针, 而cheese 则是一个 int。相反,下面的代码中:
Bentley 和 Rolls_Royce的类型依然相同。虽然前面的类型名变了,但它们的类型相同,都是指向 char 的指针。