【问题标题】:Is stdio.h a library?stdio.h 是一个库吗?
【发布时间】:2019-08-29 22:11:12
【问题描述】:

C 编程语言 调用 stdio.h 一个库。但是,有人告诉我,它是一个头文件,仅适用于编译器,这是真的,因此它不是一个库。

Internet 上的其他编程站点将其称为库。现在对library的定义不一样了吗?

有些 C 程序以 #include <stdio.h> 开头,因为 C 语言不包含文件操作函数。

引用 Brian Kernighan 和 Dennis Ritchie 的《C 编程语言》第二版第 3 页(简介)的引用更新:

标准的第二个重要贡献 [ 指“ANSI 标准,或“ANSI C”,于 1988 年完成] 是伴随 C 库的定义。它指定了访问操作系统的函数(例如读取和写入文件)、格式化的输入和输出、内存分配、字符串操作等...... UNIX 系统的“标准 I/O 库”。这个库在第一版中有描述......

图书馆的定义已经演变/改变/更新似乎是一个合乎逻辑的结论......

【问题讨论】:

  • 买一本更好的书?不要相信您在互联网上阅读的所有内容...
  • @ChrisDodd “The C Programming Language”是一位 C 的作者写的。我不知道有没有更好的书。粗略看了一下书,不知道OP的说法是否准确。
  • OP,你能引用一个你找到这句话的页​​面吗?
  • @ggorlen C 编程语言虽然确实由 C 的作者编写,但早于 1989 年 C 的标准化,因此在处理现代语言时它包含许多不准确之处C.
  • @ChrisDodd OP 已经澄清它是上面的 C 编程语言,但一开始可能并不明显(我以为是)。但是我们仍然没有报价,所以这都是猜测......

标签: c libraries


【解决方案1】:

不,stdio.h 不是库,而是头文件。接近 C 时的一个常见错误是将每个头文件都称为库,这是错误的。

C 标准库是函数的集合,在头文件中声明,stdio.h 就是其中之一。该名称代表“标准输入输出”,因此在该文件中您可以找到处理输入、输出和文件的所有函数声明。您可以找到包含在 C 标准库 here 中的头文件列表。

库是编译后的二进制文件(或一般而言,二进制文件的集合),在编译程序以利用库提供的功能时,它可以是linked (即出口)。然后使用头文件来识别这些函数的名称和签名,以便编译器知道如何调用它们。

通常,对于小型库,一个头文件就足够了,所以初学者很容易将头文件与库本身混淆。但是C标准库非常复杂,函数也很多,所以在不同的头文件中声明。

C 程序以#include <stdio.h> 开头,因为 C 语言不包含文件操作函数。

是的,没错。 C 规范仅涉及语言本身(语法、类型等),并未定义任何“标准”函数。

【讨论】:

  • 另一种看待它的方式是stdio.h 描述库以便编译器可以使用它。
  • 尽管有它的名字,“C 标准库”不一定是单个库(单个文件)。
  • 谢谢,在我的回答中注明。
  • 要对此进行测试,请#include <stdio.h> 并使用gcc -nodefaultlibs 进行编译。
  • 不,@myradio,只有声明。定义在 libc 源代码的不同 C 文件中。
【解决方案2】:

我的书《C 编程语言》称 stdio.h 为库。现在,我被告知它是一个仅用于编译器的“头文件”,这是真的,因此它不是一个库。

我有那本书的副本(第一版,还有 ANSI 版),我不记得对头文件和库之间的区别有任何混淆。你能告诉我们你在找什么吗?例如,在第 152 页上,我看到:

每个引用输入/输出库函数的源文件必须 包含该行
#include <stdio.h>

确实如此……这并不是说stdio.h 是一个库,而是说如果要使用该库,则必须包含头文件。同样在第 176 页:

描述文件的数据结构包含在 , 必须包含(通过#include)在任何使用的源文件中 标准输入/输出库中的例程。它也包括在内 通过该库中的函数...

在本段中那个库指的是“标准输入/输出库”,而不是stdio.h 本身。我可以看出有人可能会误读这一点,但在上下文中,这本书实际上并没有将stdio.h 称为这里的图书馆。

如果您能指出您正在查看的特定段落,也许我们可以更好地解释。


更新:

你从书中引用的一段话是从介绍到第二版,它是在谈论该语言的历史(第二版于 1988 年出版)。特别是,该段落正在谈论 C 标准库:

该标准的第二个重要贡献是定义了一个库来伴随 C...

看起来激发您的问题的部分是:

...该库的大部分都以 UNIX 系统的“标准 1/0 库”为模型。该库在第一版中有描述,并已广泛用于其他系统......

在所有情况下,当文本说 library 时,它的真正意思是,而不是 头文件。每个 C 库都有一个或多个关联的头文件,这些头文件为关联的库提供接口;如果没有标头,您(和您的编译器)将不知道如何访问库中定义的函数。例如,fopen() 函数在stdio.h声明,并带有函数原型:

FILE *
fopen(const char * restrict path, const char * restrict mode);

一旦您获得了fopen() 的声明,编译器就会知道如何生成指令来调用该函数,并且链接器会将您的代码连接到库文件本身中的实际函数定义 .所以当文中说标准I/O库时,其实是在说库,同名的头文件只是一个辅助文件,可以让你访问这个库。

图书馆的定义已经演变/改变/更新似乎是一个合乎逻辑的结论......

不,事实并非如此;头文件和库是并且一直是不同但相关的东西,自本书编写以来,含义确实没有改变,至少在 C 方面是这样。

【讨论】:

  • Eh.. 对于初学者,短语“每个源文件引用输入/输出库” 紧跟#include <stdio.h> 可能会被误解为stdio.h是那个“输入/输出库”。这不是那么难以想象。恕我直言,这可能就是发生的事情。
  • 见引用添加到原帖。
  • 似乎一个快速的答案是 stdio.h 是 C 连接到库的方式。
  • @NoraMcDougall-Collins 差不多。头文件在 C 编程中很常见......当您编写更复杂的程序时,您最终会将这些程序分解为多个 .c 源文件,每个源文件都会有一个 .h 头文件与之配套。包含这些头文件是告诉编译器如何调用另一个源文件中定义的函数。库就像已经为您编译好的源文件。
  • @NoraMcDougall-Collins 无论如何,如果现在看起来有点不清楚,请不要太担心......即使 C 编程语言 已经很老了作为编程语言书籍,它仍然是一本值得学习的好书和优秀的参考书。不断询问何时需要帮助。你会到达那里的。
猜你喜欢
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
相关资源
最近更新 更多