2
这是从MISRA C MISRA有关规则16-0-2 ++ 2008年的指导方针米斯拉警告为包括后卫
Macros shall only be #define'd or #undef'd in the global namespace.
我明白这个规则,但我polyspace MISRA检查工具抱怨说,以下包括在年初宣布后卫文件为不合规。我猜如果这个文件本身被包含在另一个命名空间中,会发生这种情况,但是我的头文件并不是这种情况。
什么其他错误代码可能会导致这个问题?
#ifndef FOO_H
#define FOO_H
... code etc ...
#endif
注: 实例米斯拉指导报价是
#ifndef MY_HDR
#define MY_HDR // Compliant
namespace NS
{
#define FOO // Non- Compliant
#undef FOO // Non-Compliant
}
#endif
这是一个奇怪的...规则,它不是因为如果命名空间影响预处理器,但无论如何这使得它听起来好像是这样的话。 – unwind
@unwind我相信这是整个规则的要点。因此,开发人员不知道名称空间与宏的交互不存在,因此不能假定该宏在名称空间范围内。 – Angew
不是一般的解决方案,但对于此问题的方法,如果它被允许:使用['的#pragma once'](https://en.wikipedia.org/wiki/Pragma_once)代替包括警卫。 – stefaanv