【问题标题】:Why does ISO/IEC 9899 not standardize the definitions of the functions in the C standard library? [closed]为什么 ISO/IEC 9899 没有标准化 C 标准库中函数的定义? [关闭]
【发布时间】:2020-06-28 17:11:24
【问题描述】:

ISO:IEC 9899 标准化了 C 标准库函数的原型并描述了它们的行为。它指定了某个 C 标准函数的标识符、返回类型和参数及其匹配类型。

但为什么它没有指定定义 - (具体功能如何实际工作的核心)?

为什么一个 C 标准库函数 X 的实际源代码在 f.e. Linux 上的 gcc 编译器套件(GNU C 库)、macOS 上的 clang 套件以及 Windows 上 Microsoft Visual C++ 的核心系统动态库?为什么它依赖于实现、操作系统和相关的编译器设计?


编辑: 我知道这个问题乍一看对你们大多数人来说似乎很糟糕,但它绝对有权得到回答,因为我还不知道原因。

我不建议 ISO 将定义标准化,因为这个问题是基于意见的 - 不要误会我的意思。我只是问为什么会这样,并想从你的知识和经验中学习。

【问题讨论】:

  • 总之,灵活性。
  • 为什么需要定义实现?这似乎是不必要的限制。
  • 例如因为每个平台可以有不同的方式来以最佳方式实现功能。
  • 所以您宁愿拥有对每个平台都相同的次优功能(在可能的范围内),而不是可能的最优功能?既然如此,为什么不限制所有类型的位宽呢?规范没有提到上限,只有下限。例如,有些平台char两个 字节(但sizeof(char) 仍然等于1),并且int 上从16 位增长到32 位大多数 平台。另请注意,C 规范也没有提到“堆栈”,有些硬件甚至没有堆栈。
  • @RobertSsupportsMonicaCellio -- 一些库函数使用汇编程序;这些依赖于底层平台,并且不可移植。一些库函数使用系统调用,并且不可移植。标准库为程序员提供了一个可移植的接口,但库代码本身不需要是可移植的。

标签: c function language-lawyer iso libc


【解决方案1】:

strlen 为例。如果 ISO C 标准标准化了这个函数的定义,它可能看起来像这样:

size_t strlen(char *s)
{
    size_t l = 0;
    while(s[l]) l++;
    return l;
}

这是非常低效的。 GNU C 库有用汇编语言和 C 语言编写的实现,速度非常快,但不可移植。

有些功能可能无法标准化。例如,它如何定义putcharvfprintffwrite?像longjmp 这样的汇编函数呢?或者像setjmp这样的“宏”?

可能会利用其他定义。例如,如果标准 C 委员会将 memcpy 标准化,则会发生两件事:

  • 人们可以滥用复制顺序,并且

  • 现有实现将失效。

【讨论】:

  • @RobertSsupportsMonicaCellio memcpy(s, s+1, 3); 例如是未定义的行为,如果您向前复制结果与向后复制结果不同。 putchar 需要操作系统支持,并且在 Windows、Linux、MacOS、BSD 等上完全不同。如果你想编写每秒执行数千个字符串操作的代码,你不想要一个蹩脚、幼稚的 strlen
猜你喜欢
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2010-09-19
相关资源
最近更新 更多