我最近想在我的应用程序中使用标头,但我不确定它是否适用于任何操作系统。 (任何) 因为文件系统依赖于平台操作系统。我知道 C++ 的目的之一是跨平台编译,但是当这个概念依赖于 OS-impl 时,它如何能在任何操作系统上工作呢?
每个实现都将附带特定于其环境的不同源代码。 Linux 实现看起来与 Windows 实现完全不同。
所有实现的共同点是它们提供相同的接口。因此,使用
std::filesystem
的应用程序无需担心它的内部实现方式。他们可以简单地相信它将提供标准中指定的功能。
它的工作原理与线程在 Linux 和 Windows 上工作的原因相同,而底层操作系统服务截然不同。
头文件(或非仅头子系统的库代码)包含足够的代码来适应您正在运行的平台。
举一个非常人为的例子,
file_size()
可以在Windows下调用GetFileSize()
,在Linux下调用stat()
。我不知道这是否是实际上他们所做的(1)但这肯定是可行的。
而且,在一个只能打开/关闭文件和读取字节的神秘(非常简单)操作系统上,它可以:
底线,这一切都被抽象化了,因此开发人员可以调用一组通用的函数,无论幕后是什么。
(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
条件编译部分中。