c语⾔中的带参宏定义
1. C语⾔允许宏带有参数。在宏定义中的参数称为形式参数,在宏调⽤中的参数称为实际参数,这点和函数有些类似。
2. 对带参数的宏,宏展开和⽤实参替代形参,发⽣在预处理阶段。
c语言中逗号表达式的用法3. ⽰例1:
1. #define SUM(x, y) x+x*y+y // 定义宏
2. 10 * SUM(2+2, 3+3)
1. 预期结果为:10 * (4 + 4 * 6 + 6) = 340
2. 实际结果为:10 * 2 + 2 + 2 + 2 * 3 + 3 +3 + 3 = 39
3. 修改后的宏定义:#define SUM(x, y) ((x) + (x) * (y) + (y))
1. 修改的内容:
1. 每个形参在宏定义字符串中都需要由⼩括号括起来。原因:宏展开时,不对实参表达式做任何计算。即
SUM(2+2, 3+3) !=SUM(4, 6)。
2. 将宏定义的整个字符串包含在括号中。
4. ⽰例2:使⽤宏定义,交换两个参数的值。
1. ⽅法⼀:使⽤异或运算。
1. ⽅式1:
1. 定义:#define SWAP(a, b) (a = a^b, b = a^b, a = a^b) // 该宏定义为逗号表达式。
2. 调⽤:SWAP(a, b); // 宏调⽤后需加分号。因为逗号表达式不是可执⾏的语句。
2. ⽅式2:
1. 定义:#define SWAP(a, b) {a = a^b; b = a^b; a = a^b;} // 该宏定义为三条语句构成的语句块。
2. 调⽤:SWAP(a, b) // 宏调⽤后不需要加分号。加了分号也不会有错误,仅表⽰在宏展开的三条语句执⾏完成后,执
⾏了⼀条空语句。
2. ⽅法⼆:在宏定义中定义临时变量。
1. #define SWAP(x, y) {int tmp; tmp = a; a = b; b = tmp;}
2. 注意:宏定义字符串中包含⼤括号,且在使⽤SWAP时不需要添加额外的分号:
1. int a = 1, b = 2;
2. SWAP(a, b) // 注意没有分号。
5. 可变参数宏:#define PINFO(fmt, )    printf(fmt, ##args)