66

質問は非常に明確だと思います。どのコンパイラが使用され、どのバージョンが使用されたかという情報をアプリケーションに含めることができるように、コンパイラ検出ヘッダーを作成しようとしています。

これは私が使用しているコードの一部です:

/* GNU C Compiler Detection */
#elif defined __GNUC__
    #ifdef __MINGW32__
        #define COMPILER "MinGW GCC %d.%d.%d"
    #else
        #define COMPILER "GCC %d.%d.%d"
    #endif
    #define COMP_VERSION __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__
#endif

次のように使用できます。

printf("  Compiled using " COMPILER "\n", COMP_VERSION);

LLVM とそのバージョンを検出する方法はありますか? そしてCLANG?

4

8 に答える 8

78

およびマクロは__llvm____clang__それぞれ LLVM コンパイラ (llvm-gcc または clang) または clang をチェックする公式の方法です。

__has_feature__has_builtinは、clang を使用するときにオプションのコンパイラ機能を確認するための推奨される方法です

以下を使用して、gcc、llvm-gcc、およびclangの組み込みコンパイラマクロのリストを見つけることができることに注意してください。

echo | clang -dM -E -

これにより、空の文字列が前処理され、コンパイラによって定義されたすべてのマクロが吐き出されます。

于 2009-12-24T20:15:03.950 に答える
49

ここでは答えが見つかりません。答えへのリンクのみです。完全を期すために、ここに答えがあります:

__clang__             // set to 1 if compiler is clang
__clang_major__       // integer: major marketing version number of clang
__clang_minor__       // integer: minor marketing version number of clang
__clang_patchlevel__  // integer: marketing patch level of clang
__clang_version__     // string: full version number

私は現在得ます:

__clang__=1
__clang_major__=3
__clang_minor__=2
__clang_patchlevel__=0
__clang_version__="3.2 (tags/RELEASE_32/final)"
于 2013-05-02T15:46:00.063 に答える
22

clang の場合、そのバージョン番号をテストするべきではありません。必要な機能を機能チェック マクロで確認する必要があります。

于 2009-11-07T05:13:26.497 に答える
10

InitPreprocessor.cppからのスニペット:

  // Compiler version introspection macros.
  DefineBuiltinMacro(Buf, "__llvm__=1");   // LLVM Backend
  DefineBuiltinMacro(Buf, "__clang__=1");  // Clang Frontend

  // Currently claim to be compatible with GCC 4.2.1-5621.
  DefineBuiltinMacro(Buf, "__GNUC_MINOR__=2");
  DefineBuiltinMacro(Buf, "__GNUC_PATCHLEVEL__=1");
  DefineBuiltinMacro(Buf, "__GNUC__=4");
  DefineBuiltinMacro(Buf, "__GXX_ABI_VERSION=1002");
  DefineBuiltinMacro(Buf, "__VERSION__=\"4.2.1 Compatible Clang Compiler\"");

ただし、llvmのバージョンとclang自体を取得する方法は見つかりませんでした..

于 2009-10-24T14:06:49.867 に答える
7

Pre-defined Compiler Macros pageを見て、Compilers->Clangを選択します。標準、コンパイラ、ライブラリ、OS、アーキテクチャなどの他の多くのマクロに関する情報があります。

于 2011-02-24T01:53:29.060 に答える
2

バージョン マクロではなく、機能マクロを使用するのが最善の選択であることに同意します。ブーストの例:

#include <boost/config.hpp>

#if defined(BOOST_NO_CXX11_NOEXCEPT)
 #if defined(BOOST_MSVC)
  #define MY_NOEXCEPT throw()
 #else
  #define MY_NOEXCEPT
 #endif
#else
 #define MY_NOEXCEPT noexcept
#endif

void my_noexcept_function() MY_NOEXCEPT; // it's example, use BOOST_NOEXCEPT (:

とにかく、コンパイラのバージョンが必要な場合は、 boost.predefを使用できます。

#include <iostream>
#include <boost/predef.h>

int main() {
#if (BOOST_COMP_CLANG)
  std::cout << BOOST_COMP_CLANG_NAME << "-" << BOOST_COMP_CLANG << std::endl;
#else
  std::cout << "Unknown compiler" << std::endl;
#endif
  return 0;
}

出力例:

Clang-30400000
Clang-50000000
于 2013-08-16T19:36:32.163 に答える