c++ 如何正确设置_MSVC_LANG值?

j0pj023g  于 2023-06-07  发布在  其他
关注(0)|答案(3)|浏览(259)

您可能知道,_MSVC_VALUE决定是否设置_HAS_CXX17_HAS_CXX20宏。今天我尝试在Visual Studio 2019(最新16.6.4版本)中编译以下代码:

#include <algorithm>
#include <execution>
#include <vector>

int main()
{
    std::vector<int> _vector = { 3, 2, 1 };
    std::sort(std::execution::par, _vector.begin(), _vector.end());
    return 0;
}

不幸的是,它抛出错误。例如这个:C3083 'execution': the symbol to the left of a '::' must be a type
当我查看<execution>头文件时,我注意到它无法编译,因为宏_HAS_CXX17被设置为0。

#if !_HAS_CXX17
#pragma message("The contents of <execution> are available only with C++17 or later.")
#else // ^^^ !_HAS_CXX17 / _HAS_CXX17 vvv

然后我查看了_HAS_CXX17宏的定义,它位于 vcruntime.h 文件中:

#if !defined(_HAS_CXX17) && !defined(_HAS_CXX20)
    #if defined(_MSVC_LANG)
        #define _STL_LANG _MSVC_LANG
    #elif defined(__cplusplus) // ^^^ use _MSVC_LANG / use __cplusplus vvv
        #define _STL_LANG __cplusplus
    #else  // ^^^ use __cplusplus / no C++ support vvv
        #define _STL_LANG 0L
    #endif // ^^^ no C++ support ^^^

    #if _STL_LANG > 201703L
        #define _HAS_CXX17 1
        #define _HAS_CXX20 1
    #elif _STL_LANG > 201402L
        #define _HAS_CXX17 1
        #define _HAS_CXX20 0
    #else // _STL_LANG <= 201402L
        #define _HAS_CXX17 0
        #define _HAS_CXX20 0
    #endif // Use the value of _STL_LANG to define _HAS_CXX17 and _HAS_CXX20

    #undef _STL_LANG
#endif // !defined(_HAS_CXX17) && !defined(_HAS_CXX20)

令我惊讶的是,_MSVC_LANG的值被设置为201402L。应该高很多。我设置了-std=c++17编译标志,就像在这个answer中一样。是的,这是我的答案,这证明了它在五月起作用了。
我尝试自己为宏定义正确的值,但它们被忽略或抛出一些其他错误:

#define _MSVC_LANG 201704L

// same code as before
// result: macro is ignored, no change
#define _HAS_CXX17 1
#define _HAS_CXX20 1

// same code as before
// result: 250+ errors like this one:
// E0457    "basic_string_view" is not a function or static data member

就在更新之前,我安装了一个独立于here的标准库版本。GCC 10.1.0。版本,我把mingw/bin放在Windows 10的系统路径上。
我不知道安装gcc会破坏msvc编译器。那么可能是VS 2019更新到16.6.4版本引起的?
我也看了这个question,但它没有任何帮助。

  • 有没有人可以报告类似的问题?
  • 有人知道如何修复这个问题并在C++17下使用VS 2019版本16.6.4编译代码吗?
twh00eeo

twh00eeo1#

对于未来的读者:
如果您有类似的问题,请仔细检查您正在更改的配置,然后运行。在我的例子中,我改变了 Release 的所有设置,但我试图运行 Debug 配置,不知何故,我没有注意到它。
更改配置的步骤:

  • 右键单击项目
  • 在左上角有一个下拉菜单
  • 选择您正在运行的相同配置
qyswt5oh

qyswt5oh2#

我在尝试迁移到C++20时遇到了同样的问题,并且_MSVC_LANG一直是201703(导致_HAS_CXX20为0)。
在我的例子中,问题是.vcxproj文件的语言标准“条件”仍然是stdcpp17(而语言标准正确地是stdcpp20)。从文件中删除这些行起了作用。
参见:https://developercommunity.visualstudio.com/t/Visual-studio-wont-compile-with-the-c/10378148

nkhmeac6

nkhmeac63#

将平台设置为“所有平台”,然后进行更改。
然后它们正确地通过项目。

相关问题