我目前正在学习C。我知道许多常见函数,如printf
和scanf
,实际上并不是C语言的一部分——它们是函数"标准库"的一部分。
我的问题是,为什么没有在语言中内置这样的函数?这是哲学/设计上的考虑吗?编译程序的效率问题?是否有必要充当"中间层"以确保与不同操作系统的兼容性?完全是别的吗?
它们是C的部分。C实现由编译器和库(以及其他组件,如链接器)组成。
C核心语言包括一些功能,可以编写可供其他程序使用的库代码。该标准的标准库部分指定了可以使用核心语言中定义的设施来实现的库。
有些语言中确实内置了print
命令之类的东西。C编写和调用用C编写的库代码的功能非常强大,所以这是不必要的。
此外,该库的大部分是可选的,用于";"独立式";实现(主要用于嵌入式系统)。有些实现支持完整的核心语言,但不提供大部分C标准库。
并且可以单独提供编译器和库。例如,gcc是一个编译器;它通常用于不同系统上的不同库实现(Linux上的GNU libc、Cygwin上的"newlib"、带有MinGW的Windows上的Microsoft库等等)。如果将库集成到核心语言中,那么像这样的混合和匹配将更加困难。
C语言标准(链接到最新的免费草案)定义了C。第6节定义了核心语言;第7节定义了标准库。
问题是,该标准允许两种符合的实现:托管和自由存储,请参见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标准中,而不是其他地方单独的东西。
它们是语言的一部分,只是不属于语法。
将I/O分解为一个单独的函数库可以为您购买以下内容:
- 语法变得更容易解析
- 您可以针对更广泛的平台;任何I/O缺陷都是由库函数处理的,而不是通过黑客攻击代码生成器
- 您只能实现支持平台所需的功能(即,嵌入式控制器可能不需要读取或写入格式化输出)