C++ VS 错误:提供 std::experimental::filesystem 的 <experimental/filesystem> 标头已被 Microsoft 弃用,并将被删除

Posted

技术标签:

【中文标题】C++ VS 错误:提供 std::experimental::filesystem 的 <experimental/filesystem> 标头已被 Microsoft 弃用,并将被删除【英文标题】:C++ an VS error: <experimental/filesystem> header providing std::experimental::filesystem is deprecated by Microsoft and will be REMOVED 【发布时间】:2020-01-02 14:03:45 【问题描述】:

我在 Visual Studio (Windows 10) 上使用 C++ 进行编码并收到此错误:

#error The <experimental/filesystem> header providing std::experimental::filesystem is deprecated by Microsoft \
and will be REMOVED. It is superseded by the C++17 <filesystem> header providing std::filesystem. \
You can define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING to acknowledge that you have received this warning.

有了这个标题:

#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <filesystem>//If I will disable it nothing happens.

#include <experimental/filesystem> //If I will disable it happens another error.
namespace fs = std::experimental::filesystem; 

using namespace std;

我已经尝试过:#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING 在主 cpp 文件中。它没有帮助。

然后我从here粘贴这段代码:

#ifdef __cpp_lib_filesystem
    #include <filesystem>
    using fs = std::filesystem;
#elif __cpp_lib_experimental_filesystem
    #include <experimental/filesystem>
    using fs = std::experimental::filesystem;
#else
    #error "no filesystem support ='("
#endif

也没有帮助。

消除该错误的最简单方法是什么?

【问题讨论】:

如果你正在开始一个项目并且有一个最近的 VS 版本,只需 #include &lt;filesystem&gt; 并删除 experimental/filesystem 相关的东西。在第一个 sn-p 中同时拥有 &lt;filesystem&gt;&lt;experimental/filesystem&gt; 可能没有意义。 你用错了答案。使用接受答案的代码,因为它支持 MSVS,而您使用的代码仅适用于 gcc 和 clang。 还有,你用的是哪个版本的VS? 为什么要同时包含&lt;filesystem&gt; &lt;experimental/filesystem&gt; 【参考方案1】:

将 _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING 添加到预处理器定义中。

项目 -> 属性 -> C/C++ -> 预处理器 -> 预处理器定义。

这为我解决了这个问题。

【讨论】:

【参考方案2】:

我有同样的问题,然后,当我删除实验文件系统并添加:

#include <filesystem>
namespace fs = std::filesystem;

我会得到错误:

命名空间“std”没有成员“文件系统”

解决方案是转到项目属性并按照链接中的说明进行操作。 VS2017: E0135 namespace "std" has no member "filesystem"

【讨论】:

【参考方案3】:

根据link

支持 C++17。这是一个全新的 实现,与之前的 std::experimental 不兼容 版本,由符号链接支持、错误修复和更改 标准要求的行为。目前,包括提供 新的 std::filesystem 和以前的 std::experimental::filesystem,包括 仅提供旧的实验性实现。实验 实施将在下一个破坏 ABI 的版本中删除 图书馆。

MS 在文件系统中放弃了“实验性”。

您可以尝试使用#include &lt;filesystem&gt;而不是#include &lt;experimental/filesystem&gt;,并且std::experimental::filesystem 将被删除,这意味着您应该使用std::filesystem

【讨论】:

【参考方案4】:

几周以来我一直在研究同样的问题,我在虚幻引擎 4 项目中使用了 Visual Studio 2019。在 Visual Studio 中启用 c++17 标头并使其工作很困难。网上很多人建议改用 boost 库,但这是我使用文件系统的尝试,因为我不想处理尝试下载/导入外部库的问题,所以这就是我所知道的......

** 在你开始在 Visual Studio 中编码之前,你应该构建/编译你的项目,看看 Visual Studios 是否需要任何设置;对我来说,我必须使用 Incredibuild 下载/设置免费许可证(如果有人需要获取此设置,可以在线获取教程)。 Incredibuild 对于在 Visual Studio 中构建项目很有帮助并且是必要的(至少如果您使用的是 Unreal Engine 4),但有时我在 Visual Studio 中会遇到 1 或 2 个“错误”,但会在 Unreal Engine 4 中编译,因为这些错误不是t 实际上是错误(人们在网上说 Incredibuild 很奇怪,并想提一下)**

1) 如何启用 c++17 标头

当尝试#include 这是一个 c++ 版本 17 标头时,必须启用 c++17:查看 Visual Studio“解决方案资源管理器”内部以查看项目文件,然后右键单击项目本身并打开“特性”。转到“C/C++ 语言”选项卡并将版本切换到 c++17(这很容易在网上找到)。除非你正在做一个虚幻引擎项目,因为没有“C/C++语言”选项卡,所以找到“NMake”选项卡并在“添加选项”右侧的文本框中输入:

/std:c++17 OR /std:c++latest(微软有一个我在网上找到的其他人的列表,但这些都很好)

视觉工作室将识别为标题。

2) 如何不让 c++17 命名空间工作(我尝试过的事情)

头文件开始工作后,您可以尝试最终创建一个命名空间变量:

命名空间 fs = std::filesystem; => 错误:'std 没有命名空间或类文件系统'

或者如果你也#include,你可以试试:

命名空间 fs = std::experimental::filesystem;或命名空间 fs = std::experimental::filesystem::v1; => 错误:'我们希望你定义 _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING'

如何解决这些错误?

在线,我发现将这些代码行添加到您的 ProjectName.Build.cs 文件中(可以在“解决方案资源管理器”中单击该文件后找到并编辑该文件)而不是 PCHUsage 的原始声明:

PCHUsage = PCHUsageMode.NoSharedPCHs; PrivatePCHHeaderFile = "文件夹.h"; CppStandard = CppStandardVersion.Cpp17;

这确实消除了使用 std::filesystem 时出现的错误,但会导致更多问题,而且似乎有害。在浏览了其他网站/可能的解决方案后,似乎网上的人不知道如何在 Visual Studio 中实际使用文件系统库,我一直在寻找工作代码数周。

如果您想尝试使用 std::experimental::filesystem 或 std::experimental::filesystem::v1,我尝试了 #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING,但没有骰子。

我和你在同一条船上,看起来你没有从以前的 cmets 那里得到太多帮助。如果我们在网上找不到解决方案/视频教程,我有一个 B 计划。也许我们可以尝试使用一些不同的软件编写一个 c++17 项目,或者我们可以使用不同的软件编写一个程序,这可能是启动而不是在 Visual Studio 中启用 c++17;例如,如果您想列出目录中的文件,在您首选的其他软件中创建一个可执行文件,然后从您的 Visual Studio 项目中启动该可执行文件/为其提供参数。这是我得到的最好的人。我希望这能激发一些创造力或其他什么,但我认为这比我在网上看到的要有用得多。祝你好运!我也需要那种运气

【讨论】:

使用#include 会做一些事情。 std::filesystem 及其方法都不会出现下划线错误,但项目不会在 Visual Studio 中构建或在 Unreal 中编译,因为(std 没有类或命名空间文件系统)。使用 std::experimental::filesystem 将编译,但在使用其方法时会出现带下划线的错误,就好像所有功能都被禁用一样。我一直在网上寻找解决方案,并没有找到任何可以解决这些错误的方法。如果您认为 std::filesystem 在 Visual Studio 中工作(可能是 Unreal 的东西),那么您自己尝试并发布解决方案。【参考方案5】:

在必要的地方添加对我有用的定义:

#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING 1;

即。

#ifdef __cpp_lib_filesystem
    #include <filesystem>
    namespace fs = std::filesystem;
#elif __cpp_lib_experimental_filesystem
    #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING 1;
    #include <experimental/filesystem>
    namespace fs = std::experimental::filesystem;
#else
    #error "no filesystem support ='("
#endif

【讨论】:

以上是关于C++ VS 错误:提供 std::experimental::filesystem 的 <experimental/filesystem> 标头已被 Microsoft 弃用,并将被删除的主要内容,如果未能解决你的问题,请参考以下文章

将新对话框添加到旧版 C++ 应用程序 (VS2017) 会导致许多错误。为啥?

我在 C++ 编码方面非常陌生,我无法设置 vs 代码给出错误 [关闭]

将解决方案 C++ 从 VS2005 升级到 VS2012 出现错误 LNK1181

挣扎 - 又一个内存损坏问题,错误分配(C++,VS 2008)

多个错误,在VS2017的头文件中,opengl项目C++

vs2005 一般错误 C10100b1(C++)