这是一个非常普遍的问题,因为我正在研究用于嵌入式系统的新(自 C++17 起)std::filesystem。事实上,我目前使用像 SPIFFS 这样的文件系统,并创建了自己的
file
和
dir
尽可能模仿 POSIX 功能的类。
虽然我的自定义系统可以工作,但我有几个问题:
std::filesystem
,使其适应我自己的文件系统及其局限性?或者它是否必须包含在正在使用的库中(例如,我们使用 Newlib)是否可以以某种方式重新实现 std::filesystem 以使其适应我自己的文件系统及其局限性?
是的。
或者它是否必须包含在正在使用的库中(例如,我们使用Newlib)
Newlib 是一个 C 库。它不包含任何 C++。然而,C++ 标准库很可能与您的编译器(最有可能是 gcc)捆绑在一起。该库很可能使用 POSIX C api 来访问底层文件系统。最后,POSIX C api 位于 NEWLIB 内部。
如果确实可能的话,还有意义吗?
通常的答案,视情况而定。嵌入式项目通常是专门的,并且需要最少的内存使用,因此推出您自己的替代 API,以最少的内存使用工作并专门针对您需要的特定用途,可能比可移植性或标准合规性更受青睐。
对于 NEWLIB,您应该实现 POSIX open/read/write/close/stat/etc。有
_r
名称,或者如果您不使用 _r
,则可以不使用 _REENT
来实现。他们应该将操作转发到底层文件系统。所以你只需要编写你自己的 open()
你自己的 read()
你自己的 write()
等来处理它们上的每一个可能的 POSIX 操作,并且根据你的需要单独处理 STDIN/OUT/ERR_FILENO 也很好。典型的 Linux 实现将使用函数指针的虚拟表,并且 fd
将是该表中的偏移量,但是对于嵌入式系统,您可以通过使用一些偏移量和 if
来欺骗自己。