Visual Studio 2019 C++ 和 std::filesystem

10

现在,我没想到的是,升级到一个“新”的编译器版本之后。

在VS2017中,可以通过std::experimental::filesystem访问std::filesystem。但是,现在升级到VS2019后,令我惊讶的是它根本不可用。在std::experimental和std::filesystem中都找不到。

是的,我已经尝试从项目设置中设置了c++17甚至是“最新的草案”,有什么想法吗?


评论不适合进行长时间的讨论;此对话已被移至聊天室 - Samuel Liew
5个回答

25
为了完整性和未来搜索的方便,如何在Visual Studio中切换到C++17的std::filesystem(无论是VS2019还是VS2017):
1. 在项目属性 -> 配置属性 -> C/C++ -> 语言 -> C++语言标准中将语言标准更改为至少ISO C++17 标准 (/std:c++17)
(也可以在项目属性 -> 配置属性 -> 常规 -> C++语言标准中找到)
2. 将#include <experimental/filesystem>更改为#include <filesystem> 3. 在源代码中将所有出现的std::experimental::filesystem替换为std::filesystem 4. 修复可能存在的实验版本和最终版本文件系统之间的差异

3
仍然不起作用,即使在应用了上述所有步骤的默认控制台“Hello World”项目中也是如此。 - Amphyby
@Amphyby,你能详细说明一下吗? - user1810087
我在VS 2019 Community 16.7.3中的一个新创建的项目中遇到了这个问题。似乎在应用#1步骤时,_HAS_CXX17没有被设置。 - drescherjm
@drescherjm 我无法重现这个问题。无论是使用版本16.9.3 Community,还是安装了来自Visual Studio 2019 Releases的版本16.7.3 Professional之后,都没有出现问题。_HAS_CXX17已经定义,并且一个简单的示例代码 int main(int argc, char* argv) { std::cout << _HAS_CXX17 << ":" << std::filesystem::current_path().u8string().c_str(); return 0; }编译并按预期工作。请注意,您提到的版本是2020年11月的版本,也许可以尝试当前的版本16.9.3。 - user1810087
@drescherjm:有点晚了,但我猜你只更新了一个构建配置(例如Release),而没有更新其他的。 - Ed S.

7

对于那些试图将现有的 Visual Studio 2017 项目迁移到 Visual Studio 2019 的人来说,如果没有正确的项目设置,他们很可能会在文件 VC\Tools\MSVC\14.26.28801\include\filesystem 中进行无用的折腾:

#if !_HAS_CXX17

至于为什么更改项目设置时没有自动设置此标志,我不知道原因。
因此,我使用了:

 #define _HAS_CXX17 1
#include <filesystem>

我在我的文件中使用了一个解决方法。效果不错。

更新:在另一个系统中,项目文件中有如下内容

<LanguageStandard>stdcpplatest</LanguageStandard>
<AdditionalOptions>/std:c++14 %(AdditionalOptions)</AdditionalOptions>

后一行显然导致问题。更改高级项目设置并不能删除这样的可选设置(显然)。

在另一个系统上它没有起作用,而且在“文件系统”本身中报告了更多的错误,肯定是与项目设置有关的问题,应该由VS正确处理... - Vega4
2
Visual Studio 在处理定义方面存在一些问题。尽管微软声称已经修复,但我的测试仍然给出了 199711 作为 __cplusplus 的定义值... 然而,这也可能是配置错误或某些代码阻止了 define _HAS_CXX17(在 vcruntime.h 中找到)正确定义。您可以搜索您的项目,查找类似 __cpluplus 和 _HAS_CXX17 的内容。 - user1810087
其他选项可以在项目设置->配置属性->C/C++->命令行->附加选项中找到。 - user1810087
2
不应该设置_HAS_CXX17,这应该由/std:控制。 - Billy ONeal
2
我也遇到了一个问题,使用VS2019时,_HAS_CXX17一直在工作,但突然间VS找不到它了。已经在配置中更改为cpp 17,但仍然出现错误。 - user63898

3

尽管选择了C++17语言,但我在2019版本(Microsoft Visual Studio Community 2019 Version 16.6.0)中遇到了与“include filesystem”相同的问题。

我不得不在配置窗口中显式更改平台和活动解决方案平台为x64(虽然一开始我就选择了x64)。这样,错误就消失了。


0

-2

对此的正确解决方案是: 对于Xcode:

  1. 进入项目属性
  2. 在构建设置下,向下滚动到Apple Clang- Language- c++。
  3. 在那里,您必须选择c++语言方言并将其设置为C++17[-std=c++17]。

祝好 辛格


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接