gcc v3.4.4でバグが発生し、そのバージョンのコンパイラーでのみバグを回避するためにコードに#ifdefを追加しました。
コンパイラのバージョン番号を検出するためのGCCコンパイラプリプロセッサの定義済みマクロとは何ですか?
gcc v3.4.4でバグが発生し、そのバージョンのコンパイラーでのみバグを回避するためにコードに#ifdefを追加しました。
コンパイラのバージョン番号を検出するためのGCCコンパイラプリプロセッサの定義済みマクロとは何ですか?
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)))
__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
テストできる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
オンラインドキュメントから:
__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__
このマクロは、使用中のコンパイラのバージョンを説明する文字列定数に展開されます。特定の形式のコンテンツに依存するべきではありませんが、少なくともリリース番号が含まれていると期待できます。