所以我使用最新的 Visual Studio 2022 并安装了 Intel C++ 编译器。
当我只是编写一个简单的 main() 来打印宏 MSC_VER 和 __INTEL_LLVM_COMPILER 的值时,
我明白了 MSC_VER = 1937 和 __INTEL_LLVM_COMPILER=20230200.
怎么可能两者都定义了值?我肯定使用了错误的宏,那么要检查的正确宏是什么?
旨在与 MSVC 兼容的编译器通常会定义
_MSC_VER
。类似于支持 C GNU 方言的编译器将 __GNUC__
定义为版本号:如何告诉 Clang 停止冒充其他编译器?
真正的MSVC肯定不会定义
__INTEL_LLVM_COMPILER
或__llvm__
,所以
#if defined(_MSC_VER) && !defined(__llvm__) && !defined(__INTEL_COMPILER)
// real MSVC, or a different non-LLVM-based compiler emulating it.
#else
...
#endif
检查
__llvm__
应该可以很好地排除主线 Clang 和 clang-cl
以及英特尔基于 LLVM 的 ICX / ICPX 和/或 OneAPI 内容。
__INTEL_COMPILER
由英特尔的“经典”(非 LLVM)编译器 ICC (C) 和 ICPC (C++) 定义。