[c++] #pragma曾經是C ++ 11標準的一部分嗎?



Answers

該標準的第16.6節( N3936草案)將#pragma指令描述為:

表單的預處理指令

# pragma pp-tokensopt new-line

導致實現以實現定義的方式運行。 該行為可能會導致翻譯失敗或導致翻譯員或生成的程序以不符合規定的方式行事。 任何未被實現識別的編譯指示都會被忽略。

基本上#pragma once#pragma指令的實現特定實例,不,它不是標準的。 然而。

它通常得到包括GCCClang在內的大多數“主要編譯器”的廣泛支持,因此有時建議避免使用包含防護板的樣板。

Question

傳統上,避免在C ++中使用多頭包含的標準和可移植方法是使用#ifndef - #define - #endif預編譯器指令方案,也稱為宏保護方案 (參見下面的代碼片段)。

#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif

然而,在大多數的實現/編譯器中(見下圖),還有一個更“優雅”的選擇,與宏觀保護機制#pragma once有相同的用途。 與宏保護機制相比, #pragma once有一些優點,包括代碼少,避免名稱衝突,有時還可以提高編譯速度。

做了一些研究後,我意識到儘管#pragma once指令幾乎可以被所有已知的編譯器支持,但是#pragma once指令是否是C ++ 11標準的一部分, #pragma once是否存在混淆。

問題:

  • 有人能澄清一下#pragma once指令是否是C ++ 11標準的一部分?
  • 如果它不是C ++ 11標準的一部分,是否有計劃將它包含在更高版本(例如C ++ 14或更高版本)中?
  • 如果有人能夠進一步闡述使用其中一種技術的優點/缺點(例如,宏觀警衛與#pragma once ),那也是很好的。



Links