Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在编译时检测ICC与GCC_C++_C_Gcc_Icc_Predefined Macro - Fatal编程技术网

C++ 在编译时检测ICC与GCC

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编译器等的原因是因为您的代码正在检查特定于编译器的宏,并希望看到它们…传统上,编译器已经将自己的符

如何在编译时检测我使用的是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编译器等的原因是因为您的代码正在检查特定于编译器的宏,并希望看到它们…

传统上,编译器已经将自己的符号以及版本定义为预处理器符号,以便对代码进行调整(通常用于解决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实现,这更透明