2011-09-23 53 views
30

在GNU C++編譯器似乎限定__cplusplus1Gnu C++宏__cplusplus標準符合?

#include <iostream> 
int main() { 
    std::cout << __cplusplus << std::endl; 
} 

這將打印1與標準C++模式GCC,以及C++ 0x中模式,具有gcc 4.3.4,和gcc 4.7.0。

的C++ 11 FDIS說,在「16.8預定義宏名[cpp.predefined]」

編譯C++翻譯單元時,名稱__cplusplus被定義到值201103L。 (腳註:它的目的,這一標準的未來版本將取代這個宏具有較大值的值不合格的COM pilers應使用與最多5個十進制數字的值。)

的老舊的C++ 03也有類似的規則。

GCC是否故意將其設置爲1,因爲它是「不符合」

通過閱讀該列表,我認爲如果我有一個支持C++ 11的編譯器,我可以使用__cplusplus以便攜方式檢查。但用g ++這似乎不起作用。我知道...EXPERIMENTAL...宏,但很好奇爲什麼g ++這樣定義__cplusplus

我最初的問題是在不同的空指針變體之間切換。事情是這樣的:

#if __cplusplus > 201100L 
# define MYNULL nullptr 
#else 
# define MYNULL NULL 
#endif 

有沒有實現這樣一個開關的簡單和合理的可移植的方式?

+13

附註:我沒有完全讀過這個主題,但這被認爲是g ++中的一個bug(10年前!),並在4.7.0中修復:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 – birryree

+0

'#ifndef nullptr'' #define nullptr NULL''#endif'或#ifdef nullptr'' #define MYNULL nullptr'' else'' #define MYNULL NULL'' #endif' –

回答

28

這是大約一個月前修正的(對於gcc 4.7.0)。這個bug報告提供了一個有趣的閱讀:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773

+0

上週我更新了svn樹,但沒有在* that *編譯器上運行測試代碼。等等...是的,你是對的!從上週的gcc-4.7.0:'./define-cplusplus.x 199711' – towi

+3

+1的錯誤報告鏈接。很有意思。 – Joe

+1

該錯誤已打開超過10年了......有趣的閱讀確實如此。 – Richard

0

這是一個非常古老的g ++ bug。

也就是說,編譯器不符合。

顯然它不能修復,因爲修復它會在瘋狂的平臺上破壞某些東西。

編輯:哦,我從@ birryree的評論中看到,4.7.0版剛剛修復。所以,畢竟這不是不可能的。嘿。

乾杯& hth。

0

如果我記得正確,這與Solaris 8引起的問題有關,當__cplusplus被設置爲它應該。 gcc團隊當時決定支持Solaris 8平臺,而不是在此特定條款中遵守。但我注意到最新版本的gcc結束了對Solaris 8的支持,我想這是向正確方向邁出的第一步。