【发布时间】:2021-02-09 19:15:03
【问题描述】:
我正在寻找一种跨平台(没有什么奇怪的,标准的 Linux 和 Windows 桌面安装)处理目录和文件的方式(例如:列出目录的内容,检查路径是否是文件或目录等.)。我不想使用任何boost、Qt 等。
所以经过一些研究,我发现了 <filesystem> 标头。由于我使用 C++14,我检查并发现了预标准实现(filesystem 功能成为 C++17 的 C++ 标准的一部分)它可以找到(或者至少到目前为止我使用的部分) 为<experimental/filesystem>。
我在 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