#define name(parameter-list) stuff
注意:参数列表的左括号必须与name相邻。如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。
对于#define 替换也有很多诡异的地方,有的时候会让人很费解。
解析步骤:
1.
2.
3.
宏参数和#define 定义可以包含其他#define 定义的符号。但是,宏不可以出现递归。
可以举一个例子便可明白:
-
#define f(a,b) a##b
-
#define g(a) #a
-
#define h(a) g(a)
-
h (f ( 1, 2 ) )
-
g (f ( 1, 2 ) )
写出4,5的替换过程:
5: g(f(1,2)) ---> #f(1,2)这样写是不合法的,其实是直接成了字符串常量了 f(1,2),结束
4 :h(f(1,2)) ----> g(f(1,2))------>替换f(1,2)得g(12)------>#12==12
特别要注意4,这种替换的顺序。顺序扫描之后,再返回来顺序扫描找#define定义的符号,如此循环作替换过程。