米斯拉警告包括守卫

Misra warning for include guard

这是关于 MISRA C++ 2008 指南中的 MISRA 规则 16-0-2

Macros shall only be #define'd or #undef'd in the global namespace.

我了解此规则,但我的 polyspace misra 检查工具抱怨以下包含在文件开头声明的守卫不符合要求。我想如果这个文件本身包含在另一个命名空间中,就会发生这种情况,但我的头文件不是这种情况。

代码中还有哪些其他错误可能会导致此问题?

#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

如果那些 header 守卫被放置在任何大括号之外(在全局命名空间中),那么您的代码没有问题,但您的工具已损坏。向 Polyspace 发送错误报告。

此规则背后的基本原理是 pre-processor 指令不应放在花括号内(在名称空间声明或函数等内),因为无论它们放在哪里,它们的作用域始终是全局的。