filesystem.hpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. *
  3. * How to determine whether to use <filesystem> or <experimental/filesystem>
  4. * https://stackoverflow.com/questions/53365538/how-to-determine-whether-to-use-filesystem-or-experimental-filesystem/53365539#53365539
  5. *
  6. *
  7. */
  8. // We haven't checked which filesystem to include yet
  9. #ifndef INCLUDE_STD_FILESYSTEM_EXPERIMENTAL
  10. // Check for feature test macro for <filesystem>
  11. # if defined(__cpp_lib_filesystem)
  12. # define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 0
  13. // Check for feature test macro for <experimental/filesystem>
  14. # elif defined(__cpp_lib_experimental_filesystem)
  15. # define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 1
  16. // We can't check if headers exist...
  17. // Let's assume experimental to be safe
  18. # elif !defined(__has_include)
  19. # define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 1
  20. // Check if the header "<filesystem>" exists
  21. # elif __has_include(<filesystem>)
  22. // If we're compiling on Visual Studio and are not compiling with C++17, we need to use experimental
  23. # ifdef _MSC_VER
  24. // Check and include header that defines "_HAS_CXX17"
  25. # if __has_include(<yvals_core.h>)
  26. # include <yvals_core.h>
  27. // Check for enabled C++17 support
  28. # if defined(_HAS_CXX17) && _HAS_CXX17
  29. // We're using C++17, so let's use the normal version
  30. # define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 0
  31. # endif
  32. # endif
  33. // If the marco isn't defined yet, that means any of the other VS specific checks failed, so we need to use experimental
  34. # ifndef INCLUDE_STD_FILESYSTEM_EXPERIMENTAL
  35. # define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 1
  36. # endif
  37. // Not on Visual Studio. Let's use the normal version
  38. # else // #ifdef _MSC_VER
  39. # define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 0
  40. # endif
  41. // Check if the header "<filesystem>" exists
  42. # elif __has_include(<experimental/filesystem>)
  43. # define INCLUDE_STD_FILESYSTEM_EXPERIMENTAL 1
  44. // Fail if neither header is available with a nice error message
  45. # else
  46. # error Could not find system header "<filesystem>" or "<experimental/filesystem>"
  47. # endif
  48. // We priously determined that we need the exprimental version
  49. # if INCLUDE_STD_FILESYSTEM_EXPERIMENTAL
  50. // Include it
  51. # include <experimental/filesystem>
  52. // We need the alias from std::experimental::filesystem to std::filesystem
  53. namespace std {
  54. namespace filesystem = experimental::filesystem;
  55. }
  56. // We have a decent compiler and can use the normal version
  57. # else
  58. // Include it
  59. # include <filesystem>
  60. # endif
  61. #endif // #ifndef INCLUDE_STD_FILESYSTEM_EXPERIMENTAL