由多个语句组成的宏定义应该用 do-while(0) 括起来
3.2.6 ID_macro_stmtNotEnclosed
由多个语句组成的宏定义应该用“do {”和“} while(0)”括起来,从而避免意料之外的错误。
示例:
#define SWAP(a, b)\
a ^= b; b ^= a; a ^= b // Non-compliant
如果按如下方式使用宏:
if (x > y)
SWAP(x, y);
展开后 b ^= a; a ^= b; 不在 if 语句的范围内,应改为:
#define SWAP(a, b) {\ // Compliant
a ^= b; b ^= a; a ^= b;\
}
更进一步地,建议使用 do-while(0) 结构:
#define SWAP(a, b) do {\ // Good
a ^= b; b ^= a; a ^= b;\
} while(0)
这样在使用宏时必须以分号结尾,否则无法通过编译,使宏在使用风格上与函数相同,便于阅读。
相关
依据
ISO/IEC 9899:1999 6.10.3.5(4)
ISO/IEC 9899:2011 6.10.3.5(4)