【问题标题】:Input/output stream abstraction layers for plain C普通 C 的输入/输出流抽象层
【发布时间】:2011-03-05 20:48:12
【问题描述】:

对于普通 C,是否有任何广泛使用的 I/O 流抽象层?

我所说的 I/O 流抽象层是指至少允许创建自定义读/写函数的任何层。对于 C++,有标准的 iostream 和 boost::iostreams。对于 glibc 用户,可以使用自定义流。如果需要编写可移植的 C 代码,这些将没有任何好处。

最好使用广泛使用或易于嵌入源代码的库,或两者兼而有之。

SDL_RWops 是 SDL 的一个未记录但被广泛使用的特性,zziplib 可以使用它。然而,仅仅为了获得这个特性而向 SDL 添加依赖并没有多大意义。

GLib 包含一个 GIOChannel 抽象,但该库又相当大,他们说“对 Windows 的支持只是部分完成”。

但是,对于解码器、文件格式读取器和信号处理器等小型库,上述内容并不十分令人满意:它们包含许多不必要的内容,并且 LGPL 许可阻止将相关部分嵌入到非 GPL 代码中。

【问题讨论】:

    标签: c iostream


    【解决方案1】:

    BIO abstraction in OpenSSL 听起来很合适。

    【讨论】:

    • 有趣。这是一个相当困难的依赖;它具有类似 Apache 的许可证,并且包含可能并非所有应用程序都需要的网络内容。不过,看起来它设计得很好。
    【解决方案2】:

    我想你回答了你自己的问题。

    不,没有广泛使用的蒸汽抽象库。现有的那些通常是大多数人不想依赖的库的一小部分,或者非常专业。

    您有什么要求?您在抽象库中寻找什么?我不得不承认,每次我看到一个,或者开始写一个时,我通常都会回到标准的 POSIX 接口......人们还想要什么抽象?

    【讨论】:

    • 目前我正在编写一个文件格式阅读器库,它必须尽可能地可重用和通用,即用户可能希望编写自定义输入流以支持从内存、网络、档案等加载文件. 我只是讨厌重新发明轮子,即编写我自己的小 SDL_RWops。如果 zlib 或 libpng 没有提供接口来指定用户自己的 fread 和内存分配函数,人们会更少使用它们。我想我要么自己编写,要么使用 iostreams 用 C++ 编写库并提供 C 接口。
    • 虽然我不同意 - 有时需要更多抽象 - 今天“没有广泛使用的流抽象库”似乎是正确的答案。
    【解决方案3】:

    有 libslack (GNU GPL) 可以提供您所追求的一些功能,以及这个 MIT 许可的输入流包装器:​​

    http://attractivechaos.wordpress.com/2008/10/11/a-generic-buffered-stream-wrapper/

    【讨论】:

    • libslack 似乎是 Unix-only 和 GPL 许可的。我无法一目了然地知道 kstream 实际上做了什么,而且这个例子是特定于 unix 的。不过谢谢,两者都很有趣。
    【解决方案4】:

    词法分析器生成器Quex 附带一个用于 POSIX、C++ 流等的输入流抽象。它由一组从名为ByteLoader 的类派生的类组成。

    它很容易适应任何基础设施——只需从ByteLoader 派生并实现接口即可。请参阅:Link to Code

    不过,“真实”ByteLoader 仅在生成词法分析器时才被实例化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2010-10-02
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多