2009-12-29 54 views
2

我試圖確定編譯時C++ 0x功能是否可用。是否有一個通用的預處理器宏?我正在使用Visual Studio 2010的編譯器和Intel的編譯器。確定C++ 0x可用性

+1

我知道這是重複的,我只是找不到它。編輯:這是它:http://stackoverflow.com/questions/1686348/what-is-defined-if-a-compiler-is-cpp0x-compliant – GManNickG 2009-12-29 17:29:13

+0

謝謝GMAN,但只有在完整的標準實施()顯然)。即使它有lambda表達式,英特爾也會返回199711 – Steve 2009-12-29 18:46:18

+2

C++ 0x的功能目前是非標準的。沒有標準的方式來表明非標準功能的存在。如果您正在尋找個人功能,則必須在構建系統中推出自己的指標。 – 2009-12-29 18:52:13

回答

4

__cplusplushave a value大於199711L

也就是說,並不是所有的編譯器都會填充這個值。最好使用羅傑的解決方案。

+0

您有來自草案的引用來保證嗎? – 2009-12-29 18:24:04

+0

即使使用'icc -std = C++ 0x',\ _ \ _ cplusplus仍然定義爲1. – 2009-12-29 18:26:25

+2

只是Bjarne的網站。我認爲他所說的可能會達到標準,但我想這可能並非如此。 – GManNickG 2009-12-29 18:29:23

3

通常的做法是在編譯系統中確定它,並在編譯時傳遞「配置宏」,通常命名爲HAS_ *。例如:compiler -DHAS_LAMBDA source.cpp

如果你可以從編譯器版本宏中確定這個,那麼你可以在配置頭文件中定義這些宏來檢查它;但是,對於任何由命令行選項控制的內容,您都無法執行此操作。然而,您的構建系統確實知道您指定的選項,並且可以使用該信息。

查看boost.config爲一個真實的例子和大量關於特定編譯器,版本和功能的細節。

2

我們對nullptr和auto_ptr有類似的問題。下面是我們正在嘗試使用,直到somehing標準化:

#include <cstddef> 
... 

// GCC: compile with -std=c++0x 
#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || (__GNUC__ >= 5)) 
# define HACK_GCC_ITS_CPP0X 1 
#endif 

#if defined(nullptr_t) || (__cplusplus > 199711L) || defined(HACK_GCC_ITS_CPP0X) 
# include <memory> 
    using std::unique_ptr; 
# define THE_AUTO_PTR unique_ptr 
#else 
# include <memory> 
    using std::auto_ptr; 
# define THE_AUTO_PTR auto_ptr 
#endif 

它運作良好,在海灣合作委員會和微軟的Visual Studio。順便說一句,nullptr是一個關鍵字,不能被測試 - 因此測試的原因是nullptr_t