C++中是否有預定義的宏,以便代碼可以識別標準?C++ 11預定義的宏
例如目前大多數編譯器將「數組」放入「tr1」文件夾中,但對於C++ 11,它將成爲STL的一部分。所以目前
#include <tr1/array>
但C++ 11
#include <array>
什麼是03標準和11標準,以便我可以使用#ifdef
識別預定義宏?
另外,我想有C90和C99的宏?
Thanksx
C++中是否有預定義的宏,以便代碼可以識別標準?C++ 11預定義的宏
例如目前大多數編譯器將「數組」放入「tr1」文件夾中,但對於C++ 11,它將成爲STL的一部分。所以目前
#include <tr1/array>
但C++ 11
#include <array>
什麼是03標準和11標準,以便我可以使用#ifdef
識別預定義宏?
另外,我想有C90和C99的宏?
Thanksx
請注意,雖然這可能是你可以做的最好的,但很遺憾它不適用於VC++(嘆氣)。目前的VC++(對於VS2010)將'__cplusplus'定義爲199711L,但仍然只有'array'沒有'tr1/array'(但它是用tr1命名空間定義的) – Voo
嗯不好。雖然我猜他們處於困境。他們不能聲稱是符合0x的標準,因爲他們只實現了它的一部分,而且標準仍然還有很長一段路要走 - 但是要實現他們按照標準完成的部分... – jcoder
還要注意GCC修正它,使得'__cplusplus'僅在幾周前報告了除'1'(注意:甚至不包括'199711L')之外的東西,所以它在GCC中也不適用,直到4.7.0不存在爲止。另外,它並不完全清楚從錯誤歸檔中是否會支持比C++ 0x構建更大的「199711L」以外的東西(儘管我猜測它會)。請參閱http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 - 10年以上的錯誤。 –
最終,你將不得不使用編譯器特定的信息。至少,直到C++ 0x變得更廣泛地實現。您基本上需要選擇實現某些東西的驅動程序版本,並在其上測試編譯器特定的宏。
Boost.Config庫有一些可以幫助你的宏。
雞蛋裏挑骨頭......
您的特定問題不依賴於你的編譯器,它依賴於標準庫實現。由於您可以自由選擇由您的編譯器提供的不同標準庫(例如,試用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>
定義。
你就完成了。
從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.
它幾乎沒有與標準做的,這完全取決於你的編譯器支持什麼。任何編譯器都會預先定義一個給出其版本號的宏。請查閱你的編譯器文檔 –
[確定C++ 0x可用性](http:// stackoverflow。com/questions/1975616/determine-c0x-availability) –
@Hans Passant:失敗。 '在編譯C++翻譯單元時,名稱_ _ cplusplus被定義爲值201103L。(16.8預定義的宏名稱)。 –