【问题标题】:Can <filesystem> and respectively <experimental/filesystem> be used for both Windows and Linux?<filesystem> 和 <experimental/filesystem> 可以分别用于 Windows 和 Linux 吗?
【发布时间】:2021-02-09 19:15:03
【问题描述】:

我正在寻找一种跨平台(没有什么奇怪的,标准的 Linux 和 Windows 桌面安装)处理目录和文件的方式(例如:列出目录的内容,检查路径是否是文件或目录等.)。我不想使用任何boostQt 等。

所以经过一些研究,我发现了 &lt;filesystem&gt; 标头。由于我使用 C++14,我检查并发现了预标准实现(filesystem 功能成为 C++17 的 C++ 标准的一部分)它可以找到(或者至少到目前为止我使用的部分) 为&lt;experimental/filesystem&gt;

我在 Windows 和 Visual C++ 方面的知识相当缺乏,所以我的问题是这是否也适用于它,还是仅适用于 GCC 和 Clang(到目前为止我已经尝试过的那些)?我知道在使用 cmake 时,我需要在链接时区分 Clang 和 GCC(另请参阅 3 年前的 bug report):

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  target_link_libraries(${PROJECT_NAME} c++experimental)
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  target_link_libraries(${PROJECT_NAME} stdc++fs)
endif()

在这种情况下,我不知道如何处理 Visual C++。鉴于 C++ 的特定标准,我的项目需要尽可能可移植。


注意:我不想使用 C++17,但如果有人在启用该标准的情况下构建它,我想在我的代码中添加对它的支持的可能性。这就是区分 C++14 和 C++17 很重要的原因。

【问题讨论】:

  • 在 Visual Studio 2019 中,您只需启用 c++17。没有额外的库可以链接。
  • 确实如此。 filesystem 系统标头可用于 C++14 标准,但是在升级到 C++17 之前,此标头实际上是空的。可以通过if(MSVC) set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17) endif() 完成(假设您还没有无条件地使用 C++17 标准。)
  • 为了获得最大的“可移植性”,您是否需要在 C++14 和 C++17 中构建代码?如果没有,MSVC 应该能够在没有任何额外目标的情况下正确构建。
  • 我不太愿意在公开发布的代码中使用任何“实验性”的东西,或者, 禁止,运送给客户。
  • @fabian 听起来像是一个答案!

标签: c++ visual-c++ cmake c++-experimental


【解决方案1】:

你最好不要。

来自MSVC STL source

标头提供 std::experimental::filesystem 已被 Microsoft 弃用,并将被 已移除。它被提供的 C++17 标头取代 标准::文件系统。

所以这将是未来 Visual Studio 版本的问题。

我想最好的选择是切换到 C++17。

常见的替代品是&lt;boost/filesystem&gt;。不太常见的替代方案是另一个跨平台库,例如 Qt。

【讨论】:

  • 我确实添加了&lt;filesystem&gt;,但有条件地在预处理器中。如果我有 C++14,那么我使用 &lt;experimental/filesystem&gt;。此外,我添加了一个命名空间别名,这样无论命名空间的标题和更改如何,其余代码都不会更改。最后但并非最不重要的一点是,我明确写道我不想使用boostQt 等,所以在答案中提到这一点并没有真正的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多