如何通过#define指令检测LLVM及其版本?
-
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
是检查可选编译器功能的推荐方法,它们记录在此处。
请注意,您可以使用以下命令查找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本身的版本,但是..
查看预定义的编译器宏页面,选择编译器 - > Clang 。有许多其他宏的信息可用于标准,编译器,库,操作系统,体系结构等。
我同意最好的选择是使用具有功能宏,而不是版本宏。 使用提升的示例:
#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 include文件,你可以检查 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"
不隶属于 StackOverflow