Twitterに投稿 はてなブックマークに追加 Google Bookmarksに追加

目次 >> C、C++ >> Tips

コンパイラの種類とバージョンを知るためのpre-defineされたマクロは?

コンパイルする際のコンパイラのバージョンや種類をマクロによって区別することができる。

GCCの場合

__GNUC__が定義されている。
__GNUC__にはメジャーバージョン番号が、__GNUC_MINOR__にはマイナーバージョン番号が、__GNUC_PATCHLEVEL__にはパッチレベルが入っている。__GNUC_PATCHLEVEL__はGCC3より導入された。

#ifdef __GNUC__
cout<<"GNU C/C++ "<<__GNUC__<<"."<<__GNUC_MINOR__;
    #ifdef__GNUC_PATCHLEVEL__
    cout<<"."<<__GNUC_PATCHLEVEL__;
    #endif
cout<<endl;
#endif

Apple製品の場合

__APPLE__
__APPLE_CC__

の2つがある。

__APPLE__はすべてのApple製品に定義されている。なお、AppleのOSに標準のgccのみならず、インテルコンパイラなど他の会社の製品を使ってもApple製のOS上でコンパイルする限り定義されている。

__APPLE_CC__はコンパイラのバージョンが整数値で入っている。大きい数値ほど新しいコンパイラ。

TARGET_OS_MAC
TARGET_OS_IPHONE
TARGET_IPHONE_SIMULATOR
TARGET_OS_EMBEDDED

#import <TargetConditionals.h>

で定義されている。判別には#ifdefではなく#ifを使う。

TARGET_OS_MACはOSX、iOS、iOSシミュレータすべての場合に定義されている。

TARGET_OS_IPHONEはiOS、iOSシミュレータの場合に定義されている。iOSかOSXかどうかを区別する場合は、これが定義されているかどうかで判別する。

TARGET_IPHONE_SIMULATORはiOSシミュレータの場合のみ定義されている。

TARGET_OS_EMBEDDEDは逆にiOSの実機の場合のみに定義されている。

#if (TARGET_IPHONE_SIMULATOR)
//  iOSシミュレータの場合のコード
#else
//  実機の場合のコード
#endif

Intelコンパイラの場合

__INTEL_COMPILERが定義されている。
__INTEL_COMPILERには、マイナーバージョンも含めてバージョン番号を100倍した数値が入っている。
また、__INTEL_COMPILER_BUILD_DATEはビルドされた日付が入っている。

#ifdef __INTEL_COMPILER
cout<<"Intel Compiler "<<__INTEL_COMPILER/100.0<<" build "<<__INTEL_COMPILER_BUILD_DATE<<endl;
#endif

Borland C++ / C++ Builderの場合

__BORLANDC__が定義されている。

CUDA(nvcc)の場合

__CUDACC__が定義されている。


最終更新日


本文中のFC4はFedora ProjectのFedora Core 4を、FC5はFedora Core 5を、FC6はFedora Core 6をopenSUSEはNovellのSUSE Linux OSSを表します。Fedora7以降は、単にFedora7、Fedora8、Fedora9、Fedora10、Fedora11、Fedora12、Fedora13、Fedora14、Fedora15と表示しています。Ubuntuは、必要に応じて20.04、21.04のようにバージョン番号をつけて区別しています。

ここに登場するドメイン名やIPアドレスなどはフィクションです。実在の人物・団体等とは一切関係がありません。
実際に使用する際は、各自の環境に合わせて書き換えてください。
もし何か間違いなどありましたらこちらからご連絡ください
リンクに許可は不要です。
Copyright (C) 2021 Chikuma Engineering Co., Ltd. All Rights Reserved.