C++ 使用预处理器检测MSVC,而不检测clang cl、icl、,
MSVC 2019增加了一个新的C++ 使用预处理器检测MSVC,而不检测clang cl、icl、,,c++,visual-c++,c-preprocessor,C++,Visual C++,C Preprocessor,MSVC 2019增加了一个新的\u udiv128()内在() 我想在我的C++代码中使用。然而,无论是ClangCl0.0.0还是英特尔C++编译器2019,即使编译器都设置了代码> > MSCYVER=1920 < /代码>,也和MSVC 2019一样。 由于这个问题,下面的代码不能同时使用clang cl和icl进行编译: #include <immintrin.h> #if _MSC_VER >= 1920 uint64_t res = _udiv128(a
\u udiv128()
内在()
我想在我的C++代码中使用。然而,无论是ClangCl0.0.0还是英特尔C++编译器2019,即使编译器都设置了代码> > MSCYVER=1920 < /代码>,也和MSVC 2019一样。
由于这个问题,下面的代码不能同时使用clang cl和icl进行编译:
#include <immintrin.h>
#if _MSC_VER >= 1920
uint64_t res = _udiv128(a, b, c, &d);
#endif
#包括
#如果_MSC_VER>=1920
uint64_t res=_udiv128(a、b、c和d);
#恩迪夫
是否有一种方法可以使用预处理器检测MSVC而不检测clang cl、icl等。。。我希望避免检查\u MSC\u VER
,然后排除所有其他C/C++Windows编译器
理想情况下,我希望使用Microsoft特定的宏检测MSVC,该宏仅为MSVC定义,而不是为clang cl、icl…我不能代表英特尔编译器
Clang cl定义了<代码> MSCsFiver < /C>,因为它试图成为MSVC编译器的替换点,并使用编译器附带的MS库(例如,C RTL和C++标准库)。这些库实现依赖于
\u MSC\u VER
,因此clang cl实际上没有选择
选项:
-fms兼容版本
clang cl标志选择旧版本。(如果您不提供此标志,clang cl将尝试发现您的MSVC安装,然后将兼容性标志与该安装库相匹配,这可能就是为什么您看到的正是1920。)这将阻止触发您的#如果(MSC)VER>=1920
,但如果系统库的某些部分需要1920或更高版本,则可能会产生副作用\u udiv128()
。更好的是,建议一个补丁,让它更快地完成@SevaAlekseyev OP确实说过“我希望避免检查MSC版本,然后排除所有其他C/C++Windows编译器”六个字:SFINAE。不幸的是,我不知道如何使用SFINALE使其工作……发送补丁将是一种选择,但还有英特尔的编译器不支持_udiv128()我猜其他一些模糊的C++编译器也不支持它。