如果我在使用gcc或icc,如何在编译时检测到?
(我很困惑地发现icc定义__GNUC__
- 甚至__GNUC_MINOR__
和__GNUC_PATCHLEVEL__
!为什么?)
答案 0 :(得分:17)
我们使用
#ifdef __INTEL_COMPILER
将icc
分开,假定gcc
为默认值。
答案 1 :(得分:6)
我相信您可以根据this检查__INTEL_COMPILER
。
答案 2 :(得分:2)
ICC定义__GNUC__
等的原因是因为像您这样的代码正在检查编译器特定的宏并期望看到它们......
答案 3 :(得分:1)
传统上,编译器已经定义了自己的符号以及它们作为预处理器符号的版本,以便可以调整代码(通常用于解决错误或特性)。
CLang在__has_feature
查询的形式下引入了迄今为止尚未见过的机制。它不会取代“解决bug”的做法(这就是为什么CLang仍会暴露特定符号),但允许更自然的样式来查询编译器容量。我不知道其他编制者是否计划定义这样的设施。
答案 4 :(得分:1)
您可以让处理器在预处理器输出中输出定义的宏,并查找适合您的宏。您可以像这样生成预处理器输出:
icc -dM -E -o foo.P foo.c
然后查看foo.P
(因为它是一个文本文件)。在我的例子中,我发现icc
使用编译器的版本定义了__ICC
宏。它没有定义任何__INTEL_COMPILER
。