質問は非常に明確だと思います。どのコンパイラがどのバージョンで使用されたかに関する情報をアプリケーションに含めることができるように、コンパイラ検出ヘッダーを作成しようとしています。
これは私が使用しているコードの一部です:
/* 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?
__llvm__
および__clang__
マクロは、LLVMコンパイラ(llvm-gccまたはclang)またはclangをそれぞれ確認する公式の方法です。
__has_feature
および__has_builtin
は、clangを使用するときにオプションのコンパイラ機能を確認するための推奨方法であり、ドキュメントに記載されています here 。
以下を使用して、gcc、llvm-gcc、およびclangの組み込みコンパイラマクロのリストを見つけることができます。
echo | clang -dM -E -
これは空の文字列を前処理し、コンパイラーによって定義されたすべてのマクロを吐き出します。
Clangの場合、バージョン番号をテストしないでください。 feature checking macros を使用して、必要な機能を確認する必要があります。
Pre-defined Compiler Macros page を見て、 Compilers-> Clang を選択します。標準、コンパイラ、ライブラリ、OS、アーキテクチャなどの多くの他のマクロに関する情報があります。
最良の選択はバージョンマクロではなく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
Llvmを使用してバイトコードをハックし、したがって#include
ing 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"