18

如何在编译时检测我使用的是 gcc 还是 icc?

(我很困惑地发现 icc 定义了__GNUC__——甚至__GNUC_MINOR__还有__GNUC_PATCHLEVEL__!为什么?)

4

5 回答 5

19

我们用

#ifdef __INTEL_COMPILER

拆分icc,假设gcc为默认值。

于 2011-04-20T21:24:39.180 回答
8

我相信你可以__INTEL_COMPILER根据这个检查。

于 2011-04-20T21:25:11.587 回答
1

ICC定义__GNUC__等的原因是因为像你这样的代码正在检查特定于编译器的宏并希望看到它们......

于 2011-04-20T21:56:04.407 回答
1

传统上,编译器将自己的符号及其版本定义为预处理器符号,以便可以调整代码(通常是为了解决错误或特殊性)。

CLang 在查询的形式下引入了一种我目前还没有见过的机制__has_feature。它不会取代“解决错误”的做法(这就是 CLang 仍然公开特定符号的原因),但允许使用更自然的方式来查询编译器容量。我不知道其他编译器是否计划定义这样的工具。

于 2011-04-21T08:18:01.073 回答
1

您可以让处理器输出预处理器输出中定义的宏,并寻找适合您的宏。您可以像这样生成预处理器输出:

icc  -dM -E -o foo.P foo.c

然后看看foo.P(因为它是一个文本文件)。就我而言,我发现用编译器的版本icc定义了一个__ICC宏。它没有定义任何__INTEL_COMPILER东西。

于 2012-11-29T11:56:41.180 回答