std::filesystem 如何在每个操作系统上工作?

问题描述 投票:0回答:2

我最近想在我的应用程序中使用标头,但我不确定它是否适用于任何操作系统。 (任何) 因为文件系统依赖于平台操作系统。我知道 C++ 的目的之一是跨平台编译,但是当这个概念依赖于 OS-impl 时,它如何能在任何操作系统上工作呢?

c++ c++17 std-filesystem
2个回答
2
投票

每个实现都将附带特定于其环境的不同源代码。 Linux 实现看起来与 Windows 实现完全不同。

所有实现的共同点是它们提供相同的接口。因此,使用

std::filesystem
的应用程序无需担心它的内部实现方式。他们可以简单地相信它将提供标准中指定的功能。


2
投票

它的工作原理与线程在 Linux 和 Windows 上工作的原因相同,而底层操作系统服务截然不同。

头文件(或非仅头子系统的库代码)包含足够的代码来适应您正在运行的平台。

举一个非常人为的例子,

file_size()
可以在Windows下调用
GetFileSize()
,在Linux下调用
stat()
。我不知道这是否是实际上他们所做的(1)但这肯定是可行的。

而且,在一个只能打开/关闭文件和读取字节的神秘(非常简单)操作系统上,它可以:

  • 打开文件,如果不能打开则失败。
  • 将计数器设置为零。
  • 直到文件 file 中不再有字节:
    • 读取一个字节,
    • 增量计数器。
  • 关闭文件。
  • 退货柜台。

底线,这一切都被抽象化了,因此开发人员可以调用一组通用的函数,无论幕后是什么。


(1) Boost 中使用了非常相似的方法,根据检测到的平台设置

BOOST_POSIX_API
BOOST_WINDOWS_API
宏:

# if defined(_WIN32) || defined(__CYGWIN__) // Windows default, including MinGW and Cygwin
#   define BOOST_WINDOWS_API
# else
#   define BOOST_POSIX_API 
# endif

然后它会在 Boost 中的其他地方大量使用这些宏,来决定针对特定平台执行哪些代码,例如

filesystem/path.cpp
:

#ifdef BOOST_WINDOWS_API
    #include "windows_file_codecvt.hpp"
    #include "windows_tools.hpp"
    #include <windows.h>
#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__)
    #include <boost/filesystem/detail/utf8_codecvt_facet.hpp>
#endif

不仅仅是这样的片段,还有大量的函数定义和特定于平台的代码包含在

#ifdef BOOST_WINDOWS_API
条件编译部分中。

© www.soinside.com 2019 - 2024. All rights reserved.