您可能知道,_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编译代码吗?
3条答案
按热度按时间twh00eeo1#
对于未来的读者:
如果您有类似的问题,请仔细检查您正在更改的配置,然后运行。在我的例子中,我改变了 Release 的所有设置,但我试图运行 Debug 配置,不知何故,我没有注意到它。
更改配置的步骤:
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
nkhmeac63#
将平台设置为“所有平台”,然后进行更改。
然后它们正确地通过项目。