compiler compilador c++ gcc g++ c++11

compilador - gcc c++



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

Mi compilador del sistema (gcc42) funciona bien con las características TR1 que quiero, pero trato de admitir versiones de compilador 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 compilador del sistema (dialecto predeterminado de g ++ 4.2):

#include <tr1/foo> using std::tr1::foo;

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

#include <foo> 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.


Bueno, desde gcc-4.7 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.


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 -u a b --- 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


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