宏的实参个数不可小于形参个数
3.3.2 ID_macro_insufficientArgs
宏的实参个数小于形参个数是不符合 C/C++ 标准的,参数个数不一致必然意味着某种错误,然而在某些编译环境下却可以通过编译。
示例:
#define M(a, b, c) a ## b ## c
const char* foo() {
return M("x", "y"); // Non-compliant
}
早期标准(ISO 9899:1990)对这种情况没有明确定义,后续标准对其进行了约束,但 MSVC 等编译器至今仍不把这种问题视作编译错误,需要特别注意。
相关
依据
ISO/IEC 9899:1999 6.10.3(4)
ISO/IEC 9899:2011 6.10.3(4)
ISO/IEC 14882:2003 16.3(4)
ISO/IEC 14882:2011 16.3(4)
参考
CWE-628
MISRA C 2004 19.8