2008-11-03 10 views
27

Je voudrais inclure un fichier différent en fonction de la version de GCC. Plus précisément, je veux écrire:Comment tester au moment de la compilation la version actuelle 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 

Je ne me soucie pas de gcc avant 3.2.

Remarque: Je suis assez sûr qu'il y a une variable définie au moment du pré-traitement pour cela, je ne peux pas le trouver à nouveau.

Répondre

26

Ok, après d'autres recherches, il est possible d'utiliser __GNUC_PREREQ défini dans 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

Malheureusement, ce code échoue avec le compilateur clang, qui définit '__GNUC__', mais n'inclut pas' features.h'. – Gil

+0

Eh bien, ce code est de connaître la version de GCC, il n'est donc pas surprenant qu'il échoue si clang usurper partiellement GCC. – PierreBdR

+2

Désolé, il semble que j'avais tort. L'include 'features.h' est simplement une chose spécifique à Linux, et ne devrait pas être utilisé pour du code qui est destiné à être compilé sur d'autres plateformes. – Gil

41

Il y a un certain nombre de macros qui doivent être définies pour vos besoins:

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

Le format de version est major.minor.patch, par exemple 4.0.2

La documentation pour ceux-ci peut être trouvée here.

16

Comme une note de côté:

Pour trouver toutes les macros prédéfinies:

  • Créer un fichier vide T.cpp
  • g++ -E -dM t.cpp
+15

Sans créer un fichier vide: g ++ -E -dM - JesperE

+0

Ceci ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article. –

+0

@LawrenceAiello: Votre commentaire n'a que 7 ans de retard. –

Questions connexes