1. 连接符
1.1. 字符串转换#
#
用来把参数转换成字符串
1#define pr_var(var) printf(#var " is %d\n", var);
2
3int main(int argc, char **argv)
4{
5 int a = 1, b = 2;
6
7 pr_var(a);
8 pr_var(b);
9 pr_var(a+b);
10}
1.2. 参数连接##
在宏中,##
可以用于参数连接。
1#define regname(n) x ## n
regname(8)
会被展开成x8
。
2. 可变参数
2.1. 可变参数__VA_ARGS__
__VA_ARGS__
是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。
2.2. 可编参数##__VA_ARGS__
##__VA_ARGS__
前面加上##
的作用在于,当可变参数的个数为0时,##
把前面多余的,
去掉,防止编译出错
1#define log1(...) printf(__VA_ARGS__)
2#define log2(fmt, ...) printf(fmt, __VA_ARGS__)
3#define log3(fmt, ...) printf(fmt, ##__VA_ARGS__)
4
5/// 正常
6log1("i=%d, j=%d\n", i, j)
7
8/// 正常
9log2("i=%d, j=%d\n", i, j)
10/// 编译失败,至少要两个及以上参数
11log2("hello\n")
12
13/// 正常
14log3("i=%d, j=%d\n", i, j)
15/// 正常
16log3("hello\n")