宏定义为表达式时应该用括号括起来
3.2.4 ID_macro_expNotEnclosed
宏的展开只是文本替换,不考虑运算符优先级等问题,所以宏定义为表达式时应该用括号括起来,从而避免意料之外的错误。
示例:
#define ABS(x) (x) < 0? -(x): (x) // Non-compliant
设 a 为变量,如果按如下方式使用宏:
a = ABS(a) + 1;
则相当于:
a = (a) < 0? -(a): (a) + 1;
这显然会造成意料之外的结果,所以宏定义应该用括号括起来:
#define ABS(x) ((x) < 0? -(x): (x)) // Compliant
依据
ISO/IEC 9899:1999 6.10.3.5(4)
ISO/IEC 9899:2011 6.10.3.5(4)