2009-12-20 9 views
18

Ich habe einen Fehler mit gcc v3.4.4 und was zu einem #ifdef in meinem Code, um den Fehler nur für diese Version des Compilers zu umgehen.Was sind die gcc vordefinierten Makros für die Versionsnummer des Compilers?

Was sind die vordefinierten Makros des GCC-Compiler-Präprozessors, um die Versionsnummer des Compilers zu ermitteln?

+1

mögliche Duplikate von [Wie teste ich die aktuelle Version von GCC?] (Http://stackoverflow.com/questions/259248/how-do-i-test-the-current-version-of-gcc), beide generisch C/C++ –

Antwort

26

Vom Gnu cpp Handbuch ...


__GNUC__ 
__GNUC_MINOR__ 
__GNUC_PATCHLEVEL__ 

Diese Makros von allen GNU-Compiler definiert werden, die den C-Präprozessor verwenden: C, C++, Objective-C und Fortran. Ihre Werte sind die Hauptversion, Nebenversion und Patch-Ebene des Compilers, als Integer-Konstanten. Zum Beispiel wird GCC 3.2.1 __GNUC__ bis 3, __GNUC_MINOR__ bis 2 und __GNUC_PATCHLEVEL__ zu 1 definieren. Diese Makros werden auch definiert, wenn Sie den Präprozessor direkt aufrufen.

__GNUC_PATCHLEVEL__ ist neu in GCC 3.0; Es ist auch in den weit verbreiteten Entwicklungsschnappschüssen vor 3.0 vorhanden (die sich als GCC 2.96 oder 2.97 identifizieren, je nachdem, welchen Snapshot Sie haben).

Wenn Sie nur wissen müssen, ob Ihr Programm von GCC kompiliert wird, oder ein Nicht-GCC-Compiler, der die GNU C-Dialekte akzeptiert, können Sie einfach __GNUC__ testen. Wenn Sie Code schreiben müssen, der von einer bestimmten Version abhängt, müssen Sie vorsichtiger sein.Jedes Mal, wenn die Minor-Version erhöht wird, wird der Patch-Level auf Null zurückgesetzt; Jedes Mal, wenn die Hauptversion erhöht wird (was selten vorkommt), werden die Minor-Version und die Patch-Ebene zurückgesetzt. Wenn Sie die vordefinierten Makros direkt in der bedingten verwenden möchten, müssen Sie es wie folgt schreiben:

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

Fehlende Rechte am Ende des Präprozessor-Makros? – user318904

+0

Ist es mir, oder hat clang dasselbe \ _ \ _ GNUC \ _ \ _ definiert? Also kein echter Test für gcc? – Bram

15

__GNUC__, __GNUC_MINOR__ und __GNUC_PATCHLEVEL__.

Zum Beispiel GCC 4.0.1 tun:

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

Hier ist eine kleine Befehlszeile, die schön zu erinnern ist, wenn Sie sich fragen, was die vordefinierten Präprozessordirektiven de fi vom Compiler GNU GCC definiert werden unter Ihren aktuelle Programmierumgebung:

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

+4

Netter Trick bei GCC prädizierten Präprozessordirektiven. Es ist noch besser, wenn sortiert: 'gcc -E -dM - Bart

+0

Danke für deinen Tipp - running' 'gcc -E -dM - Phil

1

Vom online docs:

__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
Diese Makros von allen GNU-Compiler definiert werden, die den C-Präprozessor verwenden: C, C++, Objective-C und Fortran. Ihre Werte sind die Hauptversion, Nebenversion und Patch-Ebene des Compilers, als Integer-Konstanten. GCC 3.2.1 definiert beispielsweise __GNUC__ bis 3, __GNUC_MINOR__ bis 2 und __GNUC_PATCHLEVEL__ bis 1. Diese Makros werden auch definiert, wenn Sie den Präprozessor direkt aufrufen.

und

__VERSION__
Dieses Makro auf eine String-Konstante, die die Version des Compilers in Verwendung beschreibt. Sie sollten sich nicht darauf verlassen, dass seine Inhalte eine bestimmte Form haben, aber es kann davon ausgegangen werden, dass sie mindestens die Versionsnummer enthalten.

4

Da ist 3 Makros für die gcc-Version auf testen.

__GNUC_MINOR__ 
__GNUC_PATCHLEVEL__ 
__GNUC__ 

z.B. mein gcc v 4.3.1 definiert sie als solche:

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

Sie können, indem Sie

gcc -E -dM -xc/dev/null

definiert die "buitin" Makros sehen