-------C陷阱与缺陷 第六章 1、不能忽视宏定义中的空格 如 #define f (x) ((x)-1) 意思为 f 代表 (x) ((x)-1) #define f(x) ((x)-1) 意思为f(x)代表 ((x)-1) 2、所有的宏在编译器预编译时就进行替换。 3、宏并不是函数(例子略) 4、宏并不是语句(例子略) 5、宏并不是类型定义 #define 是否可以代替 typedef ??? C语言支持一种叫做typedef的机制,它允许你为各种数据类型定义新的名字。但是可以用#define 代替 typedef 么? 答案是不可以,至少在某些情况下是不可以的。关于两者的区别有很多,从编译角度来讲,#define会在 预编译的时候,就会替换define的内容,而typedef不是。 论实现的效果上,有一种情况#define是不能代替typedef的,如: typedef int* PINT; PINT p1,p2;//这两条语句的意思是定义了两个int型的指针。 可如果改成#define之后呢?请看如下: #define int* PINT PINT p1,p2;//这条语句再预处理之后就会将宏替换掉,变成 int*p1,p2;意思是定义了一个int型的指针p1, 和一个int型的常量p2!!! 所以在这种情况下,#define是不能替换typedef的!!!!!! |
|