2011-08-28 103 views
23

C++中是否有預定義的宏,以便代碼可以識別標準?C++ 11預定義的宏

例如目前大多數編譯器將「數組」放入「tr1」文件夾中,但對於C++ 11,它將成爲STL的一部分。所以目前

#include <tr1/array> 

但C++ 11

#include <array> 

什麼是03標準和11標準,以便我可以使用#ifdef識別預定義宏?

另外,我想有C90和C99的宏?

Thanksx

+1

它幾乎沒有與標準做的,這完全取決於你的編譯器支持什麼。任何編譯器都會預先定義一個給出其版本號的宏。請查閱你的編譯器文檔 –

+0

[確定C++ 0x可用性](http:// stackoverflow。com/questions/1975616/determine-c0x-availability) –

+3

@Hans Passant:失敗。 '在編譯C++翻譯單元時,名稱_ _ cplusplus被定義爲值201103L。(16.8預定義的宏名稱)。 –

回答

20

here

在C++ 0X宏__cplusplus將被設置爲不同於 (大於)當前199711L的值。

你可以很可能測試它的價值,以確定它是否是C++ 0x或不那麼

+1

請注意,雖然這可能是你可以做的最好的,但很遺憾它不適用於VC++(嘆氣)。目前的VC++(對於VS2010)將'__cplusplus'定義爲199711L,但仍然只有'array'沒有'tr1/array'(但它是用tr1命名空間定義的) – Voo

+0

嗯不好。雖然我猜他們處於困境。他們不能聲稱是符合0x的標準,因爲他們只實現了它的一部分,而且標準仍然還有很長一段路要走 - 但是要實現他們按照標準完成的部分... – jcoder

+1

還要注意GCC修正它,使得'__cplusplus'僅在幾周前報告了除'1'(注意:甚至不包括'199711L')之外的東西,所以它在GCC中也不適用,直到4.7.0不存在爲止。另外,它並不完全清楚從錯誤歸檔中是否會支持比C++ 0x構建更大的「199711L」以外的東西(儘管我猜測它會)。請參閱http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 - 10年以上的錯誤。 –

1

最終,你將不得不使用編譯器特定的信息。至少,直到C++ 0x變得更廣泛地實現。您基本上需要選擇實現某些東西的驅動程序版本,並在其上測試編譯器特定的宏。

Boost.Config庫有一些可以幫助你的宏。

7

雞蛋裏挑骨頭......

您的特定問題不依賴於你的編譯器,它依賴於標準庫實現。由於您可以自由選擇由您的編譯器提供的不同標準庫(例如,試用libC++或stlport),因此編譯器的特定信息無法幫助您。

因此,最好的辦法是自己創建一個特定的頭文件,在其中您將選擇其中一個或另一個(取決於構建選項)。

// array.hpp 
#ifdef STD_HAS_TR1_ARRAY_HEADER 
#include <tr1/array> 
#else 
#include <array> 
#endif 

然後,您可以記錄編譯器選項:

傳遞-DSTD_HAS_TR1_ARRAY_HEADER將意味着std::tr1::array<tr1/array>,而不是默認<array>定義。

你就完成了。

6

從N3242草案:

16.8 Predefined macro names       [cpp.predefined] 
... 
    The name _ _ cplusplus is defined to the value 201103L when 
    compiling a C++ translation unit. 155) 
... 
155) It is intended that future versions of this standard will 
    replace the value of this macro with a greater value. 
    Non-conforming compilers should use a value with at most five 
    decimal digits.