在C/C++中,宏定义是由define完成的。
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
f(1,2) 输出:12 输出格式为%d ,若为%s则报错
g(f(1,2)) 输出:f(1,2) 输出格式%s
h(f(1,2)) 输出:12 输出格式%s
最外层宏可替换至最内层再转换,中间层则马上被转换。
define中有三个特殊的符号值得我们注意:
1. #:在宏展开的时候会将#后面的参数替换成字符串,如:
#define p(str) printf(#str);
调用p(this is test)的时候会将#exp换成"this is test"
2. ##:将前后两个的单词拼接在一起。例如:
#define cat(x,y) x##y
调用cat(test,123)展开后成为test123.
3. #@:将值序列变为一个字符
#define ch(c) #@c
调用ch(a)展开后成为'a'.
例:
#define A(x) T_##x
#define B(x) #@x
#define C(x) #x
x=1
替换为:
A(1)------> T_1 (T_##x,##符号是记号粘黏符号,将前后的字符粘黏起来。)
B(1)------> '1' ( #@x , #@ 符号会将宏的参数进行字符串字面量化,并且加‘’号)
C(1)------> "1" ( #x ,#符号会将宏的参数进行字符串字面量化,并且加""号)