C语言 stdio.h是一个库吗?

wkyowqbh  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(200)
  • C编程语言 * 将stdio.h称为库。然而,我被告知这是一个只为编译器准备的 * 头文件 *,这是真的,因此它不是一个库。

互联网上的其他编程网站称之为库。现在的“图书馆”定义不同了吗?
有些C程序以#include <stdio.h>开头,因为C语言不包含文件操作函数。
更新引用Brian Kernighan和Dennis里奇的《C编程语言》第二版第3页(介绍):
该标准的第二个重要贡献[指的是1988年完成的ANSI标准或ANSI C]是定义了一个伴随C库。它指定了访问操作系统(例如读写文件)、格式化输入和输出、内存分配、字符串操作等功能。.使用这个库与主机系统交互的程序保证了兼容的行为。该库的大部分内容都是以UNIX系统的“标准I/O库”为模型的。这个图书馆在第一版中被描述为...
这似乎是一个合乎逻辑的结论,图书馆的定义已经演变/改变/更新。

avkwfej4

avkwfej41#

stdio.h不是一个库,它是一个头文件。在接近C时,一个常见的错误是将每个头文件都称为库,这是错误的。
C标准库是函数的集合,这些函数在头文件中声明,stdio.h就是其中之一。这个名字代表“标准输入输出”,所以在这个文件中你可以找到所有处理输入,输出和文件的函数声明。您可以找到包含在C标准库here中的头文件列表。
库是一个 * 编译的二进制文件 *(或一般来说,二进制文件的集合),当编译程序以利用库提供的功能时,它可以是linked(即,头文件然后被用来标识这些函数的名称和签名,以便编译器知道如何调用它们。
通常,对于小型库,一个头文件就足够了,因此初学者很容易将头文件与库本身混淆。然而,C标准库非常复杂,有很多函数,所以它们在不同的头文件中声明。
C程序以#include <stdio.h>开始,因为C语言不包括文件操作函数。
是的. C语言规范只涉及语言本身(语法、类型等),并没有定义任何“标准”函数。

mtb9vblg

mtb9vblg2#

我的书《C编程语言》称stdio. h为一个库。现在,我被告知这是一个“头文件”,只意味着编译器,这是真的,因此它不是一个库。
我有这本书的副本(第一版,也是ANSI版),我不记得有任何混淆头文件和库之间的区别。你能告诉我们你在看什么吗?在第152页,我看到:
每个引用输入/输出库函数的源文件都必须包含以下行
#include <stdio.h>
这是真的这并不是说stdio.h是一个库,而是说如果你想使用这个库,你必须包含头文件。第176页:
描述文件的数据结构包含在中<stdio.h>,它必须包含(通过#include)在任何使用标准输入/输出库中例程的源文件中。它也包含在该库中的函数中...
在本段中,* 那个库 * 指的是“标准输入/输出库”,而不是stdio.h本身。我知道有些人可能会误解这一点,但在上下文中,这本书真的没有在这里将stdio.h称为库。
如果你能指出你正在看的那一段,也许我们能解释得更好。

更新:

你从书中引用的段落是从第二版的介绍中引用的,它谈论的是到那时为止的语言历史(第二版于1988年出版)。特别是,这段话是关于C标准库的:
该标准的第二个重要贡献是定义了一个伴随C语言的库。
看起来激发你问题的部分是这样的:
这个库的大部分都是以UNIX系统的“标准I/O库”为模型的。这个库在第一版中有描述,并且已经在其他系统上广泛使用。
在所有情况下,当文本说 library 时,它实际上意味着它,而不是 header file。每个C库都有一个或多个相关的头文件,这些头文件为相关的库提供接口;如果没有头文件,你(和你的编译器)就不知道如何访问库中定义的函数。例如,fopen()函数是在stdio.h中用函数原型 * 声明 * 的:

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

一旦你有了fopen()的声明,编译器就知道如何生成调用该函数的指令,链接器将把你的代码连接到库文件本身中的实际函数 definition。因此,当文本说 standard I/O library 时,它实际上是在谈论库,而同名的头文件只是一个辅助文件,可以让您访问库。
这似乎是一个合乎逻辑的结论,图书馆的定义已经演变/改变/更新。
不,不是这样的头文件和库一直是不同的但相关的东西,自从本书写出来以来,它们的含义真的没有改变,至少对于C来说是这样。

相关问题