关于在嵌入式系统上使用 std::filesystem 的建议

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

这是一个非常普遍的问题,因为我正在研究用于嵌入式系统的新(自 C++17 起)std::filesystem。事实上,我目前使用像 SPIFFS 这样的文件系统,并创建了自己的

file
dir
尽可能模仿 POSIX 功能的类。

虽然我的自定义系统可以工作,但我有几个问题:

  • 是否可以以某种方式重新实现
    std::filesystem
    ,使其适应我自己的文件系统及其局限性?或者它是否必须包含在正在使用的库中(例如,我们使用 Newlib)
  • 如果确实可能的话,还有意义吗?
  • 除了使我的代码更加可移植之外,使用 std::filesystem 而不是我的自定义类还能获得什么?
c++ c++17
1个回答
0
投票

是否可以以某种方式重新实现 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
来欺骗自己。

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