c++ - 能和分别可用于 Windows 和 Linux?
问题描述
我正在寻找一种处理目录和文件的跨平台(没什么奇怪的,标准的 Linux 和 Windows 桌面安装)方式(例如:列出目录的内容,检查路径是否是文件或目录等)。我不想使用任何boost
等Qt
。
因此,经过一些研究,我发现了<filesystem>
标题。由于我使用 C++14,我检查并发现了预标准实现(该filesystem
功能成为 C++17 的 C++ 标准的一部分)可以找到(或至少到目前为止我使用的部分)为<experimental/filesystem>
.
我在 Windows 和 Visual C++ 方面的知识相当缺乏,所以我的问题是这是否也适用于它,还是仅适用于 GCC 和 Clang(我迄今为止尝试过的那些)?我知道在使用时cmake
我需要在链接时区分 Clang 和 GCC(另请参阅3 年前的这个错误报告):
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 很重要的原因。
解决方案
你最好不要。
来自MSVC STL 源代码:
提供 std::experimental::filesystem 的 <experimental/filesystem> 标头已被 Microsoft 弃用,并将被删除。它被提供 std::filesystem 的 C++17 头文件所取代。
所以这将是未来 Visual Studio 版本的问题。
我想最好的选择是切换到 C++17。
常见的替代方案是<boost/filesystem>
. 不太常见的替代方案是另一个跨平台库,例如 Qt。
推荐阅读
- python - 熊猫:根据其值更改列
- angular - Angular - 使用 CoreModule 的真正实际原因
- javascript - 什么会导致反应错误 307(https://reactjs.org/link/invalid-hook-call)
- flutter - 尝试使用 MediaQuery.of(context) 获取比例屏幕宽度/高度时出现异常
- java - Android OpenGL 的东西在某些设备上不起作用:eglMakeCurrent failed 和 glDrawArrays: glError 0x505
- javascript - 在鼠标悬停时显示不同的图像(大版本)
- math - 为什么这个 8 位二进制(100000010)在屏蔽时使用 XOR 操作保持不变?
- ruby - Ruby - 如何生成与总小时数匹配的随机时间间隔?
- pyodbc - 如何在 pyodbc 中使用 executemany 运行多个 SELECT 查询
- javascript - Angular 应用程序与 Internet Explorer 的兼容性