C++ 在编译时检测ICC与GCC
如何在编译时检测我使用的是gcc还是icc (我很困惑地发现,icc定义了C++ 在编译时检测ICC与GCC,c++,c,gcc,icc,predefined-macro,C++,C,Gcc,Icc,Predefined Macro,如何在编译时检测我使用的是gcc还是icc (我很困惑地发现,icc定义了\uuu GNUC\uuuu——甚至是\uu GNUC\u MINOR\uuuu和\uu GNUC\u PATCHLEVEL\uuu!为什么?) #ifdef __INTEL_COMPILER 将icc分离,假设默认值为gcc。我相信您可以根据检查\uuuu英特尔编译器。icc定义\uuu GNUC\uuuuuuuuuuuu编译器等的原因是因为您的代码正在检查特定于编译器的宏,并希望看到它们…传统上,编译器已经将自己的符
\uuu GNUC\uuuu
——甚至是\uu GNUC\u MINOR\uuuu
和\uu GNUC\u PATCHLEVEL\uuu
!为什么?)
#ifdef __INTEL_COMPILER
将
icc
分离,假设默认值为gcc
。我相信您可以根据检查\uuuu英特尔编译器
。icc定义\uuu GNUC\uuuuuuuuuuuu编译器等的原因是因为您的代码正在检查特定于编译器的宏,并希望看到它们…传统上,编译器已经将自己的符号以及版本定义为预处理器符号,以便对代码进行调整(通常用于解决bug或特殊性)
CLang引入了一种我到目前为止还没有见过的机制,其形式是\uuuuhas\ufeature
查询。它并没有取代“解决bug”的做法(这就是为什么CLang仍然公开特定的符号),而是允许以更自然的方式查询编译器容量。我不知道是否有其他编译器计划定义这样的工具。您可以让处理器在预处理器输出中输出定义的宏,并寻找适合您的宏。可以按如下方式生成预处理器输出:
icc -dM -E -o foo.P foo.c
然后查看foo.p
(因为它是一个文本文件)。在我的例子中,我发现icc
定义了一个带有编译器版本的\uu icc
宏。它没有定义任何\uu英特尔编译器
。Clang也定义了这些,它们是出于兼容性目的:你可以用icc
替换gcc
命令,使用完全相同的选项,没有任何中断(或者这是个想法)。你让它听起来像是他的错,b)不做任何解释不是一件好事。另一种说法是,ICC实现了C(和C++)的GNU方言,而这正是\uuuu GNUC\uu
的存在所表明的。这并不意味着编译器是GNUC语言的GNU实现,这更透明