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")