web-dev-qa-db-ja.com

#defineディレクティブを使用してLLVMとそのバージョンを検出する方法は?

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

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

/* 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?

62
Carla Álvarez

__llvm__および__clang__マクロは、LLVMコンパイラ(llvm-gccまたはclang)またはclangをそれぞれ確認する公式の方法です。

__has_featureおよび__has_builtinは、clangを使用するときにオプションのコンパイラ機能を確認するための推奨方法であり、ドキュメントに記載されています here

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

echo | clang -dM -E -

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

73
Daniel Dunbar

Clangの場合、バージョン番号をテストしないでください。 feature checking macros を使用して、必要な機能を確認する必要があります。

21
Chris Lattner

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

6
Matt Joiner

最良の選択はバージョンマクロではなくfeatureマクロを使用することです。 boost の例:

#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
2
user2288008

Llvmを使用してバイトコードをハックし、したがって#includeing llvmインクルードファイルを使用している場合、llvm/Config/llvm-config.hのマクロをチェックできることに注意してください。そして具体的に:

/* Major version of the LLVM API */
#define LLVM_VERSION_MAJOR 3

/* Minor version of the LLVM API */
#define LLVM_VERSION_MINOR 8

/* Patch version of the LLVM API */
#define LLVM_VERSION_PATCH 0

/* LLVM version string */
#define LLVM_VERSION_STRING "3.8.0"
1
Hugh Perkins