米斯拉警告包括守卫

Misra warning for include guard

本文关键字:包括 守卫 警告      更新时间:2023-10-16

这是关于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

如果这些标题保护符被放在任何大括号之外(在全局命名空间中),那么您的代码是好的,您的工具是坏的。向Polyspace发送bug报告

这条规则背后的基本原理是预处理指令不应该放在大括号内(在命名空间声明或函数等中),因为它们的作用域总是全局的,无论它们放在哪里。