Как определить LLVM и его версию с помощью директив #define?
вопрос вполне понятен, я думаю. Я пытаюсь написать заголовок обнаружения компилятора, чтобы иметь возможность включать в приложение информацию о том, какой компилятор был использован и какая версия.
это часть кода, который я использую:
/* 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 и его версию? А лязг?
7 ответов:
The
__llvm__и__clang__макросы являются официальным способом проверки компилятора LLVM (llvm-gcc или clang) или clang, соответственно.
__has_featureи__has_builtinявляются рекомендуемым способом проверки дополнительных функций компилятора при использовании clang, они документированы здесь.обратите внимание, что вы можете найти список встроенных макросов компилятора для gcc, llvm-gcc и clang с помощью:
echo | clang -dM -E -это предварительно обрабатывает пустую строку и выплевывает все макросы, определенные компилятором.
Я не могу найти ответ здесь, только ссылки на ответы, поэтому для полноты картины, вот ответ:
__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)"
для clang вы не должны тестировать его номер версии, вы должны проверить наличие функций, которые вы хотите с проверка функций макросов.
фрагмент 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. Существует информация о многих других макросах для стандартов, компиляторов, библиотек, ОС, архитектур и многое другое.
Я согласен, что лучший выбор-использовать функции макросы, а не версии макросов. Пример с 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 (:но в любом случае, если вам нужно версия компилятора, вы можете использовать импульс.предопределенных:
#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 для взлома байт-кода, и таким образом
#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"
Comments