2012-05-28 47 views
5

我所有的頭文件中使用包括警衛以及編譯一次「#pragma once」是否有可能導致錯誤?

#pragma once 
#ifndef FILE_NAME_H 
#define FILE_NAME_H 

class foo 
{ 
    //foo interface.. 
}; 

#endif /* FILE_NAME_H */ 

我明白編譯一次不標準,可能是不一樣的跨編譯器,但沒有任何它會導致錯誤嗎? 以某種方式測試它是否首先可用會更好嗎?

#ifdef THIS_COMPILER_SUPPORTS_PRAGMA_ONCE 
    #pragma once 
#endif 

#ifndef FILE_NAME_H 
#define FILE_NAME_H 

class foo 
{ 
    //foo interface.. 
}; 

#endif /* FILE_NAME_H */ 

我想提供編譯一次作爲一個選項可能加速編譯和避免名稱爭食,同時還跨越編譯器提供兼容性。

+0

我真的不知道C/C++,但[這MSDN文章(http://msdn.microsoft.com/en-us/library/d9x1s805%28v=vs.71%29.aspx )似乎表明未被認出的人被忽略。 – Ryan

+0

[Is #pragma once a safe include guard?]的可能重複(http://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard) –

+0

另請參見[爲什麼不是C/C++的#pragma曾經是ISO標準嗎?](http://stackoverflow.com/questions/1695807/why-isnt-c-cs-pragma-once-an-iso-standard) –

回答

9

如果不支持#pragma once它只會被忽略[參考#1]和頭守衛會竭誠爲您服務的宗旨,所以沒有什麼錯用他們兩個,你並不真正需要支持的任何檢查#pragma once

所以理想的方法是同時使用#pragma once幷包含防護,並且您有一個可移植的代碼,可以利用編譯器可能支持的優化。


[參考#1]
標準C++ 03:16.6附註指令

形式

# pragma pp-tokensopt new-line

的預處理指令使實現以實現定義的方式運行。 任何未被實現識別的編譯指示都將被忽略。

5

該標準規定「任何未被實現識別的編譯指示都會被忽略」,因此即使編譯器不知道#pragma一次,您也可能沒有問題。

相關問題