【问题标题】:Why isn't the C standard library built into the language?为什么 C 标准库没有内置到语言中?
【发布时间】:2014-12-08 09:30:58
【问题描述】:

我目前正在学习 C。我了解许多常用函数,例如 printfscanf 实际上并不是 C 语言的一部分——它们是函数“标准库”的一部分。

我的问题是,为什么语言中没有内置这样的功能?这是哲学/设计考虑吗?编译程序时的效率问题?有必要充当“中间层”以确保与不同操作系统的兼容性吗?完全不同的东西?

【问题讨论】:

  • 怀疑这是否有真正的答案,因为这只是猜测和/或意见。说唯一“真正的答案”可以是“因为”,因为他们想那样做,所以他们做到了。它是明智的还是不明智的?其他语言这样做是明智还是不明智?
  • printfscanf C 的一部分。有“C 语言”和“C 标准库”。如果这对您更有意义,它们都是“C 标准”的一部分。
  • 我认为您需要澄清这个问题。从某些方面来说,它们是语言“内置”的(例如 printf 出现在 C 标准中,而 C 库本身没有单独的文档)。您是否在问为什么该标准使用它所使用的术语?为什么编译器通常不将这些函数实现为内置函数?
  • C 有独立的实现,不需要提供任何<stdio.h> 函数。 C 标准也解决了这些问题,因此必须提供“核心语言”和库托管实现。
  • @dyp K&R C,第 2 版,第 151 页:“输入和输出设施不是 C 语言本身的一部分……在本章中,我们将描述标准库,它是一组为 C 程序提供输入和输出、字符串处理、存储管理、数学例程和各种其他服务的函数。”

标签: c standard-library


【解决方案1】:

它们 C 的一部分。C 实现由编译器和库(以及其他组件,如链接器)组成。

C 核心语言 包括可以编写可供其他程序使用的库代码的工具。标准的标准库部分指定了一个可以使用核心语言中定义的工具来实现的库。

某些语言确实在语言中内置了 print 命令之类的东西。 C 用于编写和调用用 C 编写的库代码的功能非常强大,因此没有必要。

此外,对于“独立”实现(主要用于嵌入式系统),大部分库可选。有些实现支持完整的核心语言,但不提供大部分 C 标准库。

并且可以单独提供编译器和库。例如,gcc 是一个编译器;它通常与不同系统上的不同库实现一起使用(Linux 上的 GNU libc、Cygwin 上的“newlib”、带有 MinGW 的 Windows 上的 Microsoft 库等等)。如果将库集成到核心语言中,这样的混合和匹配会更加困难。

C language standard(链接是最新的免费草稿)定义了 C。第 6 节定义了核心语言;第 7 节定义了标准库。

【讨论】:

    【解决方案2】:

    问题是该标准允许两种一致的实现:托管和freestading,参见N1570 4/p6:

    两种形式的一致的实现被托管和 独立式。 符合要求的托管实现应接受任何 严格符合程序。 符合标准的独立实施 应接受任何不使用复杂程序的严格符合的程序 类型和在其中使用库中指定的功能 条款(条款 7)仅限于标准标题的内容 <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h><stdint.h><stdnoreturn.h>。一个符合要求的实现可能有 扩展(包括额外的库函数),只要他们这样做 不改变任何严格遵守程序的行为。

    通过这种设计,将库组织为标准头文件,如果不支持,可以简单地“切断”某些头文件。

    请注意,C 标准定义了所有头文件以及标准 C 库的函数。它确实包含在 C 标准中,而不是在其他地方分开。

    【讨论】:

      【解决方案3】:

      它们是语言的一部分,但它们不是语法的一部分。

      将 I/O 分解到单独的函数库中可以为您带来以下好处:

      1. 语法变得更容易解析;
      2. 您可以定位更广泛的平台;任何 I/O 缺陷都由库函数处理,而不是通过破解代码生成器;
      3. 您只能实现支持平台所需的功能(即嵌入式控制器可能不需要读取或写入格式化输出);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-28
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多