2016-11-10 85 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。

這一規則背後的理由是,預處理器指令是不應該放置在大括號(命名空間聲明或功能等內),因爲它們的範圍始終是全球無論在何處放置。