6.1 不能忽视宏定义中的空格
define f (x) ((x)-1) //f 代表 (x) ((x)-1)
6.2 宏并不是函数
define abs(x) (((x) >= 0) ? (x) : - (x)) //宏定义中出现的所有括号,作用是预防引起与优先级有关的问题。
使用宏的另一个危险是,宏展开可能产生非常庞大的表达式,占用的空间远远超过所期望的空间。
6.3 宏并不是语句
6.4 宏并不是类型定义
宏的一个常见用途是,使多个不同变量的类型可在一个地方说明:
#define FOOTYPE struct foo
FOOTYPE a;
FOOTYPR b, c;
这样,编程者只需在程序中改动一行代码,即可改变a,b,c的类型;
但是最好还是使用类型定义:typedef struct foo FOOTYPE;
例如:#define T1 struct foo*
typedef struct foo *T2;
从定义上看,T1和T2从概念上完全相同,都是指向结构foo的指针,但用他们声明多个变量时,会出现问题:T1 a, b;
T2 a, b;
第一个声明被扩展为:struct foo *a, b; //a被定义为一个指向结构的指针,而b却被定义却不是指针;
第二个声明则不同,它定义了a和b都是指向结构的指针。