如何通过#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?
__llvm__
和__clang__
macros是分别检查LLVM编译器(llvm-gcc或clang)或clang的官方方式。
__has_feature
和__has_builtin
是使用clang时检查可选编译器特性的推荐方法,这里__has_builtin
它们进行说明。
请注意,您可以使用以下命令查找gcc,llvm-gcc和clang的内置编译器macros的列表:
echo | clang -dM -E -
这预处理一个空string,并吐出编译器定义的所有macros。
我在这里找不到答案,只有答案的链接,所以为了完整性,这里是答案:
__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,你不应该testing它的版本号,你应该使用function检查macros检查你想要的function 。
从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\"");
虽然我没有find任何方式来获取llvm和clang本身的版本。
看一下预定义的Compilermacros页面 ,selectCompilers-> Clang 。 有许多关于标准,编译器,库,操作系统,体系结构等macros的信息。
请注意,如果您使用llvm来破解字节码,并且因此#include
包含llvm包含文件,则可以在llvm/Config/llvm-config.h
检查这些macros。 具体而言:
/* 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"