如何通过#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"