各种C标准库实现之间有什么区别[已关闭]

ehxuflar  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(158)

已关闭。此问题需要更多focused。当前不接受答案。
**想要改进此问题吗?**更新问题,使其仅关注editing this post的一个问题。

21天前关闭。
Improve this question
当我研究fopen以及FILE结构是如何构建的时候,我发现它不仅仅是GNU libc,我开始仔细研究各种实现,比如Google的BionicMuslNewlib和其他几个。我只知道Musl,直到现在我的理解是,它只是gnu libc的一个更优化的版本。我没有考虑过如何,或者如果,他们是允许不同,以及他们如何可能在相同的方面相似。
具体地说,PosixANSIC标准是如何规定各种实现的?这意味着所有fopenFILE(所有libc函数/结构)都被确定为或多或少地构建相同的?还是它们是不透明的,只是遵循操作相同的“标准”(公开返回值和接口)?
直觉上,我会认为它就像我所描述的那样,但也许Musl确实是从编译/链接中更有效地构建和优化的。
任何见解都是非常赞赏的。

bqujaahr

bqujaahr1#

具体地说,Posix和ANSI C标准是如何规定各种实现的?
它们并不是这样,它们只是规定了调用每个库函数的预期行为。
各种C标准库实现之间有什么区别
您可以将其分为2类:

  • 不同操作系统的实现。例如,为Windows设计的标准C库必须使用Windows的内核API和/或依赖于其他Windows特定的动态链接库,为Linux设计的标准C库必须使用Linux内核API,对于使用微内核或外内核的操作系统,标准C库可能完全不同(例如,可能“open()”向不同的进程发送消息)。
  • 实现。在这种情况下,大多数差异可能是微小的。例如,如果您要求5个不同的程序员实现他们自己的strlen()版本,您可能会得到2个几乎相同的简单版本,1个几乎相同但略有不同的简单版本,以及2个非常不同的复杂版本(并包含高度优化的内联汇编)。但是;将不是标准C库一部分的内容(例如,特定于操作系统的扩展和POSIX之类的扩展)推入同一个库是很方便的,因此C标准库的不同实现可以具有不同的扩展和/或不同版本的扩展。

当然,标准C库的实现可以尝试是可移植的并且支持多个环境(例如,32位和64位代码)和多个操作系统(例如,具有大量#ifdef ...);因此在标准C库的源代码试图支持的目标方面也存在差异。

相关问题