2016-11-10 87 views
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 
+4

这是一个奇怪的...规则,它不是因为如果命名空间影响预处理器,但无论如何这使得它听起来好像是这样的话。 – unwind

+0

@unwind我相信这是整个规则的要点。因此,开发人员不知道名称空间与宏的交互不存在,因此不能假定该宏在名称空间范围内。 – Angew

+0

不是一般的解决方案,但对于此问题的方法,如果它被允许:使用['的#pragma once'](https://en.wikipedia.org/wiki/Pragma_once)代替包括警卫。 – stefaanv

回答

1

如果这些头警卫放置在任何括号以外(在全局命名空间),那么你的代码是正确的,你的工具被打破。发送错误报告给Polyspace。

这一规则背后的理由是,预处理器指令是不应该放置在大括号(命名空间声明或功能等内),因为它们的范围始终是全球无论在何处放置。