GNU C ++ ¿cómo verificar cuándo -std = c ++ 0x está en efecto?

Mi comstackdor del sistema (gcc42) funciona bien con las características TR1 que quiero, pero trato de admitir versiones de comstackdor más nuevas que los sistemas, tratando de acceder a las cabeceras TR1 un #error que exige la opción -std = c ++ 0x debido a cómo interfaces con la biblioteca o alguna burbuja de hub como esa.

/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. 

Tener que suministrar un interruptor adicional no es problema, para soportar GCC 4.4 y 4.5 bajo este sistema (FreeBSD), ¡pero obviamente cambia la imagen!

Usando mi comstackdor del sistema (dialecto predeterminado de g ++ 4.2):

 #include  using std::tr1::foo; 

Usar las versiones más nuevas (4.5) del comstackdor con -std = c ++ 0x:

 #include  using std::foo; 

¿Hay alguna forma de usar el preprocesador, que puedo decir si g ++ se está ejecutando con las características de C ++ 0x habilitadas?

Algo así es lo que estoy buscando :

 #ifdef __CXX0X_MODE__ #endif 

pero no he encontrado nada en el manual o fuera de la web.

A este ritmo, estoy empezando a pensar que la vida sería más fácil, usar Boost como una dependencia y no preocuparme por la llegada de un nuevo estándar de lenguaje antes de TR4 … jeje.

Si comstack con -std=c++0x , se __GXX_EXPERIMENTAL_CXX0X__ .

Parece, con gcc 4.4.4, que solo hay una sugerencia de macro predefinida que -std = c ++ 0x está en vigor:

 #define __GXX_EXPERIMENTAL_CXX0X__ 1 

No tengo acceso a gcc 4.5.0, pero puede verificarlo usted mismo:

 [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 

Para el comando de una línea,

 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 

te da algo como:

 +#define __GXX_EXPERIMENTAL_CXX0X__ 1 

Bueno, desde gcc-4.7 en adelante podrás comprobar __cplusplus:

“G ++ ahora establece la macro predefinida __cplusplus en el valor correcto, 199711L para C ++ 98/03 y 201103L para C ++ 11”

Esta debería ser la forma correcta y compatible con el estándar para hacerlo. Desafortunadamente, no funciona para la mayoría de gcc instalados en la naturaleza.