2010-06-02 8 views
37

Mi compilador del sistema (gcc42) funciona bien con las características TR1 que quiero, pero tratando 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 se interconecta con la biblioteca o alguna burbuja de hub así.GNU C++ cómo verificar cuándo -std = C++ 0x está en efecto?

/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 extra es ningún problema, para apoyar GCC 4.4 y 4.5, bajo este sistema (FreeBSD), pero es obvio que cambia la imagen!

Usando mi sistema compilador (g ++ dialecto 4,2 por defecto):

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

Usando nuevos (4.5) versiones del compilador con -std = C++ 0x:

#include <foo> 
using std::foo; 

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

Algo como esto 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 preocuparse por un nuevo estándar de lenguaje que llegue antes de TR4 ... jeje.

Respuesta

36

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

+13

Hasta que GCC agregue en el nuevo __cplusplus definido que las opciones más portátiles serían agregar '# si está definido (__ GXX_EXPERIMENTAL_CXX0X__) || __cplusplus> = 201103L ' – gnash117

+1

¿Es lo mismo para '-std = C++ 11' y GCC4.8.1? – Manu343726

82

Parece, con gcc 4.4.4, al haber sólo una insinuación macro predefinida que -std = C++ 0x es, en efecto:

#define __GXX_EXPERIMENTAL_CXX0X__ 1 

que no tienen acceso a gcc 4.5.0 , pero se puede comprobar que uno 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 

Por comando de una línea de hacer,

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 

le da algo así como:

+#define __GXX_EXPERIMENTAL_CXX0X__ 1 
+28

+1: "Dale a un hombre un pez; lo has alimentado por hoy. Enseña a un hombre a pescar; y no tendrás que escuchar su incesante lloriqueo sobre lo hambriento que está.":) –

+0

+1, he marcado esta pregunta solo para esta respuesta – lurscher

+0

Es posible que tenga que escuchar historias de peces donde' -> | | <-' es una pulgada. – emsr

17

Pues bien, desde gcc-4.7 en adelante usted será capaz de comprobar __cplusplus:

"G ++ ahora establece el __cplusplus macro predefinida en el valor correcto, 199711L para C++ 98/03, y para 201103L 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.

+2

FWIW esto proviene de C++ 11 16.8/1. –

+0

@LightnessRacesinOrbit Sí, tienes razón en que esta característica no es específicamente gcc sino que es estándar en C++. Desafortunadamente, debido a algún problema con uno de los objetivos de gcc, no pudimos definir __cplusplus con sensatez incluso para C++ 03/98. Creo que el objetivo ya estaba en desuso y podríamos seguir adelante. – emsr

Cuestiones relacionadas