在宏的参数列表中不应使用预编译指令
3.4.6 ID_directiveInMacroArgument
如果预编译指令出现在宏的参数列表中,会导致标准未定义的行为。
示例:
#define PRINT(s) printf(#s)
PRINT(
#ifdef MAC // Non-compliant, undefined behavior
rabbit
#else // Non-compliant
hamster
#endif // Non-compliant
);
可能会打印出 hamster,也可能是 #ifdef MAC rabbit #else hamster #endif 这种怪异的结果。
依据
ISO/IEC 9899:1999 6.10.3(11)-undefined
ISO/IEC 9899:2011 6.10.3(11)-undefined
ISO/IEC 14882:2003 16.3(10)-undefined
ISO/IEC 14882:2011 16.3(11)-undefined
参考
MISRA C 2012 20.6
MISRA C++ 2008 16-0-5