只应在全局作用域中定义宏
3.2.12 ID_macro_inBlock
宏不受作用域限制,在非全局作用域中定义宏易引起误解。
示例:
void foo(void) {
#define M 123 // Non-compliant, defined in a function scope
....
}
例中宏 M 在函数中定义,但其作用范围却是全局的。
如果宏与某作用域密切相关,在该作用域内定义宏,使用后再取消定义是一种惯用方式,如:
void foo(void) {
#define M 123 // Let it go?
....
#undef M
}
审计工具不妨通过配置决定是否放过这种情况。
配置
allowDefineAndUndefInSameBlock: 是否允许在同一非全局作用域内定义并取消定义宏
相关
依据
ISO/IEC 9899:1999 6.10.3.5(1)
ISO/IEC 9899:2011 6.10.3.5(1)
参考
MISRA C 2004 19.5
MISRA C++ 2008 16-0-2