预处理:编译之前,由c语言预处理器对程序代码做的必要的转换处理。
宏只对程序的文本起作用,它提供了一种对组成c程序的字符进行变换的方法,而不作用于程序中的对象。
1. 宏不是函数
#define abs(x) (((x)>=0)?(x):-(x))
宏定义中出现的括号,它们的作用是预防引起与优先级相关的问题。
即使宏定义中的各个参数与整个结果表达式都被括号括起来,也仍然还可能有其他问题存在,比如说,一个操作数如果在两处被用到,就会被求值两次。
2. 宏不是类型定义
宏的常见用途是:使多个不同变量的类型可在一个地方说明。
#define FOOTYPE struct foo
FOOTYPE a,b;
但是,我们最好还是使用类型定义:
typedef struct foo FOOTYPE;
该语句定义FOOTYPE为一个新类型,与struct foo完全等效。
下面例子说明了为什么最好使用类型定义:
#define PCHAR char*
typedef char* pchar;
PCHAR p1, p2;
pchar p3, p4; (notes:这段声明取自sponeliu的blog)
根据上下文,似乎是想将p1,p2,p3,p4都声明为char*类型的,但是,事实是如此么?p2是么?p2并没有预期成为一个char*类型,因为define会在预处理阶段展开,所以语句1就相当于 char* p1, p2;而在这条语句下,p2不是一个指针,而是一个char类型变量!