我可以使用啥预定义的宏来检测 clang?

Posted

技术标签:

【中文标题】我可以使用啥预定义的宏来检测 clang?【英文标题】:What predefined macro can I use to detect clang?我可以使用什么预定义的宏来检测 clang? 【发布时间】:2011-02-09 03:35:59 【问题描述】:

我正在尝试检测用于编译我的源代码的编译器。我可以轻松找到预定义的宏来检查 MSVC 或 GCC(例如,参见 http://predef.sourceforge.net/),但我找不到任何宏来检查 clang。

有人知道 clang 是否定义了像 __CLANG__ 这样的宏来了解当前正在编译我的代码的内容吗?

【问题讨论】:

predef.sourceforge.net/precomp.html#sec4 Updated list of compiler macros 【参考方案1】:

要获取编译器使用的所有预定义宏的列表,请使用以下命令:

clang -dM -E -x c /dev/null

你可以对 gcc 做同样的事情。

【讨论】:

【参考方案2】:

使用strings + grep 找到答案:

$ strings /usr/bin/clang | grep __ | grep -i clang
__clang__

【讨论】:

【参考方案3】:

这个问题已经回答了多年,但让我补充一下(供将来参考)它是如何在 Windows 中完成的:

echo | clang -dM -E -

与 GCC 相同:

echo | gcc -dM -E -

请注意:最后一个破折号- 实际上很重要! (否则两个编译器都会得到error: no input files

【讨论】:

仅供参考,Windows 等效于 /dev/nullNUL: @legalize 哇!我不知道!这很酷;你在哪里找到的? 它从 DOS 时代就已经存在,只是大多数 DOS/Windows 用户从不需要它。 这也是我在 Linux 中经常做的事情。输入 /dev/null 需要更多的工作。

以上是关于我可以使用啥预定义的宏来检测 clang?的主要内容,如果未能解决你的问题,请参考以下文章

使用单元格作为位置在文件结构中保存文件的宏

Excel里的宏有啥作用?

Makefile 是如何工作的?其中的宏定义分别是啥意思?

Clang,在源代码端检测 -mavx 编译器参数

用于 GCC/G++ 的宏来区分 Linux 和 Mac OSX?

c语言的宏定义