Jenia
Jenia

Reputation: 414

C++ an VS error: <experimental/filesystem> header providing std::experimental::filesystem is deprecated by Microsoft and will be REMOVED

I coded in C++ on Visual Studio (Windows 10) and got this error:

#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.

With this headers:

#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;

I've tried: #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING in the main cpp file. It didnt help.

So then I paste this code from 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

Didn't helped too.

What is the easiest way to get out that error?

Upvotes: 9

Views: 21406

Answers (6)

BillD
BillD

Reputation: 94

I had a case where while working in a C++ v14 project where it wasn't appropriate for me to update the C++ syntax to v17 (it included kernel code and embedded device targeting with capability limits).

In my case it was a slightly different warning but the same process should help anyone that stumbles on this in the future.. placing the warning acknowledgment in the module (before the include with the experimental namespace) worked for me without having to go down the path of adopting other changes that might have impacted the client.

So, at the top of your impacted module: #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING 1;

then place your includes..

The order matters because the warning is triggered by the include itself. I noticed the previous developer had placed the acknowledgement definition alongside other #define statements that were below the includes in parse-order of the module.

Best of luck!

Upvotes: 1

Do0Nnie
Do0Nnie

Reputation: 56

I had the same problem and then, when I removed the experimental filesystem and added:

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

I would get the error:

namespace “std” has no member “filesystem”

The solution was to go to project properties and do as instructed in the link. VS2017: E0135 namespace "std" has no member "filesystem"

Upvotes: 4

Maya
Maya

Reputation: 441

Adding the define where necessary worked for me:

#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING 1;

ie.

#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

Upvotes: 2

Spark
Spark

Reputation: 371

Add _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING to Preprocessor definitions.

Project -> Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions.

This solved the issue for me.

Upvotes: 5

user12573761
user12573761

Reputation:

I've been researching this same problem for weeks, and I'm using visual studio 2019 on an Unreal Engine 4 project. It's difficult to enable c++17 headers in visual studio and make them work. A lot of people online suggests using the boost library instead, but this is my attempt in using filesystem because I don't want to deal with trying to download / import external libraries, and so here's what I know...

** Before you start coding in visual studio, you should build / compile your project and see if Visual Studios needs anything set up; for me, I had to download / setup a free license with Incredibuild (there are tutorials online if someone needs to get this setup). Incredibuild is helpful and necessary to build projects in Visual Studio (at least if you're using Unreal Engine 4), but sometimes I get 1 or 2 "errors" in visual studio, but will compile in Unreal Engine 4 because those errors aren't actually errors (people say online that Incredibuild is weird, and wanted to mention that)**

1) How to enable c++17 Headers

When trying to #include which is a c++ version 17 header, it's necessary to enable c++17: Look inside the visual studio "solution explorer" to view the project files, and right-click the project itself and open "properties". Go to the "C/C++ language" tab and switch the version to c++17 (this is easy to find this online). Unless you're doing an Unreal Engine project because there is not a "C/C++ language" tab, so instead find the "NMake" tab and in the text-box to the right of "Addition Options" type in:

/std:c++17 OR /std:c++latest (Microsoft has a list I found online of others, but these are fine)

and visual studios will recognize as a header.

2) How NOT to get c++17 namespaces to work (things I've tried)

After the headers start working you can try to finally make a namespace variable:

namespace fs = std::filesystem; => ERROR: 'std does not have a namespace or class filesystem'

OR if you also #include you can try:

namespace fs = std::experimental::filesystem; OR namespace fs = std::experimental::filesystem::v1; => ERROR: 'we want you to define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING'

  • how does one fix these errors?

Online, I found that adding these lines of code to your ProjectName.Build.cs file (which can be found and edited after clicking on the file in "solution explorer") instead of the original declaration for PCHUsage:

PCHUsage = PCHUsageMode.NoSharedPCHs; PrivatePCHHeaderFile = "Folder.h"; CppStandard = CppStandardVersion.Cpp17;

this did get rid of the Errors when using std::filesystem BUT caused wayyyy more problems, and seemed harmful. After looking through other websites / possible solutions, it seems people online don't know how to actually use the filesystem library in visual studio, I've been looking for working code for weeks.

if you want to try and use the std::experimental::filesystem or std::experimental::filesystem::v1, I tried #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING, but no dice.

I'm in the same boat as you man, and it looks like you didn't get much help from the previous comments. If we can't find a solution / video tutorial online, I have a plan B. Maybe we could try and write a c++17 project using some different software, or maybe we could write a program using a different software that could be launched instead of enabling c++17 into Visual Studio; for example, if you wanted to list the files in a directory, make an executable file in your preferred other software, and launch that executable / feed it arguments from your visual studio project. That's the best I got man. I hope that sparks some creativity or whatever, but I think it's a lot more helpful than what I've seen online. Good luck to you! and I need that luck too

Upvotes: 1

Jeaninez - MSFT
Jeaninez - MSFT

Reputation: 4040

According to the link

C++17’s is supported. This is a completely new implementation, incompatible with the previous std::experimental version, necessitated by symlink support, bug fixes, and changes in standard-required behavior. Currently, including provides the new std::filesystem and the previous std::experimental::filesystem, and including provides only the old experimental implementation. The experimental implementation will be REMOVED in the next ABI-breaking release of the libraries.

MS abandoned 'experimental' in filesystem.

You could try to use #include <filesystem>instead of #include <experimental/filesystem> and the std::experimental::filesystem is slated for removal, this means you should use std::filesystem.

Upvotes: 4

Related Questions