如何通过#define指令检测LLVM及其版本?

Car*_*rez 62 c llvm clang c-preprocessor

我认为这个问题很清楚.我正在尝试编写一个编译器检测头,以便能够在应用程序中包含有关使用哪个编译器和哪个版本的信息.

这是我正在使用的代码的一部分:

/* 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
Run Code Online (Sandbox Code Playgroud)

哪个可以这样使用:

printf("  Compiled using " COMPILER "\n", COMP_VERSION);
Run Code Online (Sandbox Code Playgroud)

有没有办法检测LLVM及其版本?和CLANG?

Dan*_*bar 73

__llvm____clang__宏,分别检查了LLVM编译器(LLVM-GCC或铛)或铛的正式方法.

__has_feature并且__has_builtin是使用clang时检查可选编译器功能的推荐方法,这里记录它们.

请注意,您可以使用以下命令找到gcc,llvm-gcc和clang的内置编译器宏列表:

echo | clang -dM -E -
Run Code Online (Sandbox Code Playgroud)

这会预处理一个空字符串并吐出编译器定义的所有宏.

  • 请注意,即使对于clang和llvm-gcc也定义了`__GNUC__`. (26认同)

Wal*_*ter 39

我在这里找不到答案,只能找到答案的链接,所以为了完整起见,这里是答案:

__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
Run Code Online (Sandbox Code Playgroud)

我目前得到:

__clang__=1
__clang_major__=3
__clang_minor__=2
__clang_patchlevel__=0
__clang_version__="3.2 (tags/RELEASE_32/final)"
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,这是不可靠的。供应商(如 Apple)发布了自己的 clang 版本,并更改​​了这些数字以反映他们自己的版本号,这与他们的编译器所基于的 clang 版本没有关系。如果您使用它来尝试确定某些内容是否受支持,则可能会出现误报或误报(取决于供应商的版本号是大于还是小于 clang 的版本号)。 (2认同)

Chr*_*ner 21

对于clang,您不应测试其版本号,您应该使用功能检查宏检查所需的功能.

  • 在处理LLVM错误时,这无济于事.比如fastcall支持中的bug,它大约在build 2335中被破坏并在build 2336中修复. (5认同)
  • @osgx:尽管如此,他可以提供链接并添加文档以增加其项目的可用性. (2认同)

Chr*_*oph 10

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\"");
Run Code Online (Sandbox Code Playgroud)

我没有找到任何方法来获得llvm和clang本身的版本,但是..


Mat*_*ner 6

查看预定义的编译器宏页面,选择Compilers-> Clang.有许多其他宏的信息可用于标准,编译器,库,操作系统,体系结构等.