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 <filesystem>
并删除 experimental/filesystem
相关的东西。在第一个 sn-p 中同时拥有 <filesystem>
和 <experimental/filesystem>
可能没有意义。
你用错了答案。使用接受答案的代码,因为它支持 MSVS,而您使用的代码仅适用于 gcc 和 clang。
还有,你用的是哪个版本的VS?
为什么要同时包含<filesystem>
和 <experimental/filesystem>
?
【参考方案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 <filesystem>
而不是#include <experimental/filesystem>
,并且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在必要的地方添加对我有用的定义:
#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