在编译时检测ICC与GCC
Detect ICC vs GCC at compile time
如何在编译时检测我是否使用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
相关文章:
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC对可能有效的代码抛出init list生存期警告
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用gcc从静态链接的文件中查找可选符号
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- 对clang、gcc和icc中开关枚举类返回的处理一致
- ICC 中的 -O2 搞砸了汇编程序,ICC 中的 -O1 和 GCC / Clang 中的所有优化都很好
- 幼稚矩阵乘法的优化(ICC与GCC)
- Clang和GCC与MSVC和ICC的比较:如果复制/移动省略也适用,那么在复制/移动构造函数中是否需要静态断言
- Why is sizeof(std::mutex)==40 (gcc,clang,icc)?
- 模板专用化静态初始化 icc+vc vs gcc+clang
- 为什么gcc和icc为c++函数生成具有相同标签名称的asm ?
- 在编译时检测ICC与GCC