宏的实参不应有副作用
3.3.1 ID_macro_sideEffectArgs
当宏参数有“副作用(side effect)”时,如果宏定义中没有或多次引用到该参数,会导致意料之外的错误。
示例:
#define I(a)
#define M(a) ((a) + (a))
int foo(int& a) {
return M(++a); // Non-compliant, returns ‘((++a) + (++a))’
}
void bar(int& a) {
I(a--); // Non-compliant, does nothing
}
例中 M 和 I 看起来像是函数调用,而展开后的结果却在意料之外。