Как определить LLVM и его версию с помощью директив #define?
-
06-07-2019 - |
Вопрос
Вопрос вполне понятен, я думаю. Я пытаюсь написать заголовок обнаружения компилятора, чтобы иметь возможность включать в приложение информацию о том, какой компилятор использовался и какая версия.
Это часть кода, который я использую:
/* 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, они задокументированы здесь .
Обратите внимание, что вы можете найти список макросов встроенного компилятора для 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 . Существует информация о многих других макросах для стандартов, компиляторов, библиотек, ОС, архитектур и т. Д.
Я согласен с тем, что лучше всего использовать макросы 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
для включения файлов 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"