2009-12-20 4 views
18

J'ai couru dans un bug avec gcc v3.4.4 et pour y mettre un #ifdef dans mon code pour contourner le bogue uniquement pour cette version du compilateur.Quelles sont les macros prédéfinies par gcc pour le numéro de version du compilateur?

Quels sont les compilateur GCC préprocesseur macros prédéfinies pour détecter le numéro de version du compilateur?

+1

duplicata possible de [Comment tester la version actuelle de GCC?] (Http://stackoverflow.com/questions/259248/how-do-i-test-the-current-version-of-gcc), tous deux génériques C/C++ –

Répondre

26

A partir du manuel gnu cpp ...


__GNUC__ 
__GNUC_MINOR__ 
__GNUC_PATCHLEVEL__ 

Ces macros sont définies par tous les compilateurs GNU qui utilisent le préprocesseur C: C, C++, Objective-C et Fortran. Leurs valeurs sont la version principale, la version mineure et le niveau de correctif du compilateur, en tant que constantes entières. Par exemple, GCC 3.2.1 définira __GNUC__-3, __GNUC_MINOR__-2 et __GNUC_PATCHLEVEL__ à 1. Ces macros sont également définies si vous invoquez le préprocesseur directement.

__GNUC_PATCHLEVEL__ est nouvelle à GCC 3.0; il est également présent dans les instantanés de développement largement utilisés menant à 3.0 (qui s'identifient comme GCC 2.96 ou 2.97, selon le cliché que vous avez). Si tout ce que vous devez savoir est de savoir si votre programme est compilé par GCC ou un compilateur non-GCC qui prétend accepter les dialectes GNU C, vous pouvez simplement tester __GNUC__. Si vous avez besoin d'écrire du code qui dépend d'une version spécifique, vous devez être plus prudent.Chaque fois que la version mineure est augmentée, le niveau de patch est remis à zéro; chaque fois que la version majeure est augmentée (ce qui arrive rarement), la version mineure et le niveau de correctif sont réinitialisés. Si vous souhaitez utiliser les macros prédéfinies directement dans le conditionnel, vous devrez l'écrire comme ceci:

  /* Test for GCC > 3.2.0 */ 
      #if __GNUC__ > 3 || \ 
       (__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \ 
           (__GNUC_MINOR__ == 2 && \ 
            __GNUC_PATCHLEVEL__ > 0)) 
+1

Manque de parent à la fin de la macro du préprocesseur? – user318904

+0

Est-ce moi, ou est-ce que clang a le même \ _ \ _ GNUC \ _ \ _ défini? Donc pas un vrai test pour gcc? – Bram

15

__GNUC__, __GNUC_MINOR__ et __GNUC_PATCHLEVEL__.

Par exemple, GCC 4.0.1 fera:

#define __GNUC__ 4 
#define __GNUC_MINOR__ 0 
#define __GNUC_PATCHLEVEL__ 1 

Voici une petite ligne de commande qui est agréable de se rappeler quand vous vous demandez qui sont les directives de préprocesseur prédé fi nies défini par le compilateur GNU GCC sous votre environnement de programmation actuelle:

gcc -E -dM - </dev/null | moins

+4

Bon tour sur les directives de préprocesseur pré-configurées par GCC. C'est encore mieux lorsqu'il est trié: 'gcc -E -dM - Bart

+0

Merci pour votre conseil - courir '' gcc -E -dM - Phil

1

de la online docs:

__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
Ces macros sont définies par tous les compilateurs GNU qui utilisent le préprocesseur C: C, C++, Objective-C et Fortran. Leurs valeurs sont la version principale, la version mineure et le niveau de correctif du compilateur, en tant que constantes entières. Par exemple, GCC 3.2.1 définira __GNUC__ à 3, __GNUC_MINOR__ à 2 et __GNUC_PATCHLEVEL__ à 1. Ces macros sont également définies si vous invoquez le préprocesseur directement.

et

__version__
Cette macro pour résultat une chaîne constante qui décrit la version du compilateur utilisé. Vous ne devriez pas compter sur son contenu ayant une forme particulière, mais on peut compter sur pour contenir au moins le numéro de version.

4

Il y a 3 macros pour la version gcc, vous pouvez tester sur.

__GNUC_MINOR__ 
__GNUC_PATCHLEVEL__ 
__GNUC__ 

par exemple. mon gcc v 4.3.1 les définit comme tel:

#define __GNUC_MINOR__ 1 
#define __GNUC_PATCHLEVEL__ 3 
#define __GNUC__ 4 

Vous pouvez voir les macros "de buitin" définies en exécutant

gcc -E -dM -xc/dev/null

Questions connexes