Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++ 使用预处理器检测MSVC,而不检测clang cl、icl、,_C++_Visual C++_C Preprocessor - Fatal编程技术网

C++ 使用预处理器检测MSVC,而不检测clang cl、icl、,

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

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, 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实际上没有选择

选项:

  • Seva从评论中提出的建议将适用于您。我知道这不是您首选的解决方案,但这是一种选择。您可以在一个地方进行测试,以便在情况改善时只需更新一个地方

  • 尝试使用
    -fms兼容版本
    clang cl标志选择旧版本。(如果您不提供此标志,clang cl将尝试发现您的MSVC安装,然后将兼容性标志与该安装库相匹配,这可能就是为什么您看到的正是1920。)这将阻止触发您的
    #如果(MSC)VER>=1920
    ,但如果系统库的某些部分需要1920或更高版本,则可能会产生副作用

  • 等待clang cl实现
    \u udiv128()
    。更好的是,建议一个补丁,让它更快地完成


  • @SevaAlekseyev OP确实说过“我希望避免检查MSC版本,然后排除所有其他C/C++Windows编译器”六个字:SFINAE。不幸的是,我不知道如何使用SFINALE使其工作……发送补丁将是一种选择,但还有英特尔的编译器不支持_udiv128()我猜其他一些模糊的C++编译器也不支持它。