31

gcc v3.4.4でバグが発生し、そのバージョンのコンパイラーでのみバグを回避するためにコードに#ifdefを追加しました。

コンパイラのバージョン番号を検出するためのGCCコンパイラプリプロセッサの定義済みマクロとは何ですか?

4

4 に答える 4

41

gnucppマニュアルから...


__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__

これらのマクロは、Cプリプロセッサを使用するすべてのGNUコンパイラ(C、C ++、Objective-C、Fortran)によって定義されています。それらの値は、整数定数としてのコンパイラーのメジャーバージョン、マイナーバージョン、およびパッチレベルです。たとえば、GCC 3.2.1は、3、2 、および1を定義__GNUC__します。これらのマクロは、プリプロセッサを直接呼び出す場合にも定義されます。__GNUC_MINOR____GNUC_PATCHLEVEL__

__GNUC_PATCHLEVEL__GCC3.0の新機能です。また、3.0までの広く使用されている開発スナップショットにも存在します(スナップショットに応じて、GCC 2.96または2.97として識別されます)。

プログラムがGCCによってコンパイルされているかどうか、またはGNU C方言を受け入れると主張する非GCCコンパイラであるかどうかだけを知る必要がある場合は、単純にテストできます__GNUC__。特定のバージョンに依存するコードを書く必要がある場合は、もっと注意する必要があります。マイナーバージョンが増えるたびに、パッチレベルはゼロにリセットされます。メジャーバージョンが増加するたびに(これはめったに発生しません)、マイナーバージョンとパッチレベルがリセットされます。事前定義されたマクロを条件付きで直接使用する場合は、次のように記述する必要があります。

          /* Test for GCC > 3.2.0 */
          #if __GNUC__ > 3 || \
              (__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
                                 (__GNUC_MINOR__ == 2 && \
                                  __GNUC_PATCHLEVEL__ > 0)))
于 2009-12-20T19:38:16.800 に答える
21

__GNUC____GNUC_MINOR__および__GNUC_PATCHLEVEL__

たとえば、GCC4.0.1は次のことを行います。

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

これは、現在のプログラミング環境でGNUGCCコンパイラによって定義された事前定義されたプリプロセッサディレクティブがどれであるか疑問に思っているときに覚えておくと便利な小さなコマンドラインです。

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

于 2009-12-20T19:34:59.010 に答える
4

テストできるgccバージョンには3つのマクロがあります。

__GNUC_MINOR__ 
 __GNUC_PATCHLEVEL__ 
 __GNUC__ 

たとえば、私のgcc v 4.3.1は、それらを次のように定義しています。

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

を実行することで定義された「buitin」マクロを見ることができます

gcc -E -dM -xc / dev / null

于 2009-12-20T19:40:18.310 に答える
2

オンラインドキュメントから:

__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
これらのマクロは、Cプリプロセッサを使用するすべてのGNUコンパイラ(C、C ++、Objective-C、Fortran)によって定義されています。それらの値は、整数定数としてのコンパイラーのメジャーバージョン、マイナーバージョン、およびパッチレベルです。たとえば、GCC 3.2.1は__GNUC__を3に、__ GNUC_MINOR__を2に、__GNUC_PATCHLEVEL__を1に定義します。これらのマクロは、プリプロセッサを直接呼び出す場合にも定義されます。

__VERSION__
このマクロは、使用中のコンパイラのバージョンを説明する文字列定数に展開されます。特定の形式のコンテンツに依存するべきではありませんが、少なくともリリース番号が含まれていると期待できます。

于 2009-12-20T19:36:27.180 に答える