这是关于MISRA C ++ 2008指南中的MISRA规则16-0-2
Macros shall only be #define'd or #undef'd in the global namespace.
我理解这条规则,但是我的polyspace misra检查工具抱怨说,在文件开头声明的包含guard作为Non-Compliant。我想如果这个文件本身包含在另一个命名空间中会发生这种情况,但我的头文件不是这种情况。
代码中的其他哪些错误可能会导致此问题?
#ifndef FOO_H
#define FOO_H
... code etc ...
#endif
注意: Misra指南中引用的示例是
#ifndef MY_HDR
#define MY_HDR // Compliant
namespace NS
{
#define FOO // Non- Compliant
#undef FOO // Non-Compliant
}
#endif
答案 0 :(得分:1)
如果这些标题保护放在任何大括号之外(在全局命名空间中),那么您的代码就可以了,您的工具就会被破坏。向Polyspace发送错误报告。
此规则背后的基本原理是,预处理器指令不应放在大括号内(命名空间声明或函数内部等),因为它们的范围始终是全局的,无论它们放在何处。