在编译时检测ICC与GCC

Detect ICC vs GCC at compile time

本文关键字:GCC ICC 检测 编译      更新时间:2023-10-16

如何在编译时检测我是否使用gcc或icc?

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

我们使用

#ifdef __INTEL_COMPILER

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

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

ICC定义__GNUC__等的原因是因为像您这样的代码正在检查编译器特定的宏,并期望看到它们…

传统上,编译器已经定义了它们自己的符号以及它们的版本作为预处理器符号,以便代码可以被改编(通常是为了解决错误或特殊性)。

CLang引入了一种我到目前为止还没有见过的机制,以__has_feature查询的形式。它并没有取代"绕过bug"的做法(这就是CLang仍然暴露特定符号的原因),而是允许以更自然的方式查询编译器的能力。我不知道其他编译器是否计划定义这样的功能。

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

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

然后查看foo.P(因为它是一个文本文件)。在我的例子中,我发现icc用编译器的版本定义了一个__ICC宏。但是它没有定义任何__INTEL_COMPILER