GNU C ++ come controllare quando -std = c ++ 0x è in effetto?

Il mio compilatore di sistema (gcc42) funziona bene con le funzionalità di TR1 che desidero, ma provo a supportare versioni di compilatore più nuove rispetto ai sistemi, cercando di accedere alle intestazioni TR1 e #error che richiede l’opzione -std = c ++ 0x a causa di come si interfaccia con la libreria o con qualche hub come quello.

/usr/local/lib/gcc45/include/c++/bits/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options. 

Dover fornire un interruttore extra non è un problema, per supportare GCC 4.4 e 4.5 in questo sistema (FreeBSD), ma ovviamente cambia l’immagine!

Usando il mio compilatore di sistema (dialetto predefinito g ++ 4.2):

 #include  using std::tr1::foo; 

Usando le versioni più recenti (4.5) del compilatore con -std = c ++ 0x:

 #include  using std::foo; 

Esiste comunque il pre processore, che posso dire se g ++ è in esecuzione con funzionalità C ++ 0x abilitate?

Qualcosa di simile è ciò che sto cercando :

 #ifdef __CXX0X_MODE__ #endif 

ma non ho trovato nulla nel manuale o fuori dal web.

A questo ritmo, sto iniziando a pensare che la vita sarebbe stata più semplice, usare Boost come dipendenza, e non preoccuparsi di un nuovo standard linguistico che arriva prima di TR4 … hehe.

Se si compila con -std=c++0x , verrà definito __GXX_EXPERIMENTAL_CXX0X__ .

Sembra che con gcc 4.4.4 sia solo un suggerimento di macro predefinito che -std = c ++ 0x è in effetti:

 #define __GXX_EXPERIMENTAL_CXX0X__ 1 

Non ho accesso a gcc 4.5.0, ma puoi verificarlo personalmente:

 [16:13:41 0 ~] $ g++ -E -dM -std=c++0x -x c++ /dev/null >b [16:13:44 0 ~] $ g++ -E -dM -std=c++98 -x c++ /dev/null >a [16:13:50 0 ~] $ diff -uab --- a 2010-06-02 16:13:50.200787591 +0200 +++ b 2010-06-02 16:13:44.456912378 +0200 @@ -20,6 +20,7 @@ #define __linux 1 #define __DEC32_EPSILON__ 1E-6DF #define __unix 1 +#define __GXX_EXPERIMENTAL_CXX0X__ 1 #define __LDBL_MAX_EXP__ 16384 #define __linux__ 1 #define __SCHAR_MAX__ 127 

Per fare un comando su una riga,

 g++ -E -dM -std=c++98 -x c++ /dev/null > std1 && g++ -E -dM -std=c++0x -x c++ /dev/null > std2 && diff -u std1 std2 | grep '[+|-]^*#define' && rm std1 std2 

ti dà qualcosa come:

 +#define __GXX_EXPERIMENTAL_CXX0X__ 1 

Bene, da gcc-4.7 in poi potrai controllare __cplusplus:

“G ++ ora imposta la macro predefinita __cplusplus sul valore corretto, 199711L per C ++ 98/03 e 201103L per C ++ 11”

Questo dovrebbe essere il modo corretto e conforms allo standard per farlo. Sfortunatamente, non funziona per la maggior parte di gcc installato in natura.