2008-11-03 12 views
27

Me gustaría incluir un archivo diferente según la versión de GCC. Más precisamente, quiero escribir:¿Cómo pruebo en tiempo de compilación la versión actual de GCC?

#if GCC_VERSION >= 4.2 
# include <unordered_map> 
# define EXT std 
#elif GCC_VERSION >= 4 
# include <tr1/unordered_map> 
# define EXT std 
#else 
# include <ext/hash_map> 
# define unordered_map __gnu_cxx::hash_map 
# define EXT __gnu_cxx 
#endif 

No me importa gcc antes de 3.2.

Nota: Estoy bastante seguro de que hay una variable definida en el tiempo de preprocesamiento para eso, simplemente no puedo encontrarlo de nuevo.

Respuesta

26

Ok, después de más búsquedas, una forma posible de hacerlo es usando __GNUC_PREREQ definido en features.h.

#ifdef __GNUC__ 
# include <features.h> 
# if __GNUC_PREREQ(4,0) 
//  If gcc_version >= 4.0 
# elif __GNUC_PREREQ(3,2) 
//  If gcc_version >= 3.2 
# else 
//  Else 
# endif 
#else 
// If not gcc 
#endif 
+2

Desafortunadamente este código falla con el compilador clang, que define '__GNUC__', pero no incluye' features.h'. – Gil

+0

Bueno, este código es para conocer la versión de GCC, por lo que no es sorprendente que falle si clang se hace pasar por GCC. – PierreBdR

+2

Lo siento, parece que estaba equivocado. La característica 'features.h' es simplemente algo específico de Linux, y no se debe confiar en ningún código que se compile en otras plataformas. – Gil

41

Hay una serie de macros que se deben definir para sus necesidades:

__GNUC__    // major 
__GNUC_MINOR__  // minor 
__GNUC_PATCHLEVEL__ // patch 

El formato de la versión es major.minor.patch, por ejemplo, 4.0.2

La documentación para estos se puede encontrar here.

16

Como nota al margen:

Para descubrir todas las macros predefinidas:

  • Crear archivo T.cpp vacío
  • g++ -E -dM t.cpp
+15

Sin crear un archivo vacío: g ++ -E -dM - JesperE

+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación. –

+0

@LawrenceAiello: Su comentario tiene solo 7 años de retraso. –

Cuestiones relacionadas