Gcc v3.4.4でバグが発生し、そのバージョンのコンパイラでのみバグを回避するためにコードに#ifdefを追加しました。
コンパイラのバージョン番号を検出するためのGCCコンパイラプリプロセッサの定義済みマクロとは何ですか?
Gnucppマニュアルから...
__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
これらのマクロは、Cプリプロセッサを使用するすべてのGNUコンパイラ:C、C++、Objective-C、Fortranです。これらの値は、コンパイラのメジャーバージョン、マイナーバージョン、パッチレベルです。たとえば、GCC 3.2.1は__GNUC__
を3に、__GNUC_MINOR__
を2に、__GNUC_PATCHLEVEL__
を1に定義します。これらのマクロは、プリプロセッサを直接呼び出す場合にも定義されます。
__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
これは、現在のプログラミング環境でGNU GCCコンパイラによって定義された事前定義されたプリプロセッサディレクティブがどれであるか疑問に思っているときに覚えておくと便利な小さなコマンドラインです。
gcc -E -dM-</ dev/null | less
テストできるgccバージョンには3つのマクロがあります。
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
__GNUC__
例えば私のgccv 4.3.1は、それらを次のように定義しています。
#define __GNUC_MINOR__ 1
#define __GNUC_PATCHLEVEL__ 3
#define __GNUC__ 4
を実行することで定義された「buitin」マクロを見ることができます
gcc -E -dM -x c/dev/null