web-dev-qa-db-ja.com

コンパイラのバージョン番号のgcc定義済みマクロは何ですか?

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

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

26
WilliamKF

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)))
36
DigitalRoss

__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

18
Gregory Pakosz

テストできる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

4
nos