C编程语言调用stdio.h一个库。但是,有人告诉我,这是一个仅适用于编译器的头文件,这是事实,因此它不是库。
Internet上的其他编程站点将其称为库。库的定义现在是否有所不同?
有些C程序以#include <stdio.h>C语言开头,因为C语言不包含文件操作功能。
使用Brian Kernighan和Dennis Ritchie的The C Programming Language(第二版,第3页,引言)进行更新:
该标准的第二个重要贡献[指的是1988年完成的“ ANSI标准或” ANSI C“]是伴随C库的定义。它指定了访问操作系统的功能(例如,读取和写入)文件),格式化的输入和输出,内存分配,字符串操作等。使用此库与主机系统进行交互的程序可确保兼容行为。大多数库都是基于“标准I UNIX系统的“ / O库”。该库在第一版中进行了介绍...
图书馆的定义已经发展/改变/更新似乎是合乎逻辑的结论。
Mar*_*lli 11
不,stdio.h不是库,而是头文件。处理C时的一个常见错误是将每个头文件都调用一个库,这是错误的。
C标准库是函数的集合,这些函数在头文件中声明,并且stdio.h是其中之一。该名称代表“标准输入输出”,因此在该文件中,您可以找到处理输入,输出和文件的所有函数声明。您可以在此处找到C标准库中包含的头文件列表。
库是已编译的二进制文件(或通常是二进制文件的集合),可在编译程序时将其链接以利用库提供的功能(即导出)。然后使用头文件来标识这些函数的名称和签名,以便编译器知道如何调用它们。
通常,对于小型库,单个头文件就足够了,因此对于初学者来说,很容易将头文件与库本身混淆。但是,C标准库非常复杂并且具有许多功能,因此它们在不同的头文件中声明。
#include <stdio.h>之所以使用C程序,是因为C语言不包含文件操作功能。
是的,这是正确的。C规范仅涉及语言本身(语法,类型等),并且未定义任何“标准”功能。
我的书“C 编程语言”调用了 stdio.ha 库。现在,我被告知它是一个仅用于编译器的“头文件”,这是真的,因此它不是一个库。
我有那本书的副本(第一版,还有 ANSI 版),我不记得对头文件和库之间的区别有任何混淆。你能告诉我们你要找的地方吗?例如,在第 152 页上,我看到:
每个引用输入/输出库函数的源文件都必须包含以下行
#include <stdio.h>
这是真的……这并不是说这stdio.h 是一个库,而是说如果你想使用这个库,你必须包含头文件。同样在第 176 页:
描述文件的数据结构包含在 中,它必须(通过#include)包含在使用标准输入/输出库中的例程的任何源文件中。它也包含在该库中的函数中......
在本段中,该库指的是“标准输入/输出库”,而不是stdio.h它本身。我可以看到有人可能会误读它,但在上下文中,这本书实际上并没有stdio.h在这里调用图书馆。
如果您可以将我们指向您正在查看的特定段落,也许我们可以更好地解释。
更新:
你从书中引用的那段话是从第二版的引言开始的,它是在谈论到那时为止的语言历史(第二版于 1988 年问世)。特别是,该段正在谈论 C 标准库:
该标准的第二个重要贡献是定义了一个伴随 C...
看起来激发您问题的部分是这样的:
...该库的大部分内容都以 UNIX 系统的“标准 1/0 库”为模型。这个库在第一版中有描述,并且也被广泛用于其他系统......
在所有情况下,当文本说library 时,它确实意味着,而不是header file。每个 C 库都有一个或多个相关的头文件,这些头文件提供了相关库的接口;如果没有头文件,您(和您的编译器)将不知道如何访问库中定义的函数。例如,fopen()函数在带有函数原型的声明中stdio.h:
FILE *
fopen(const char * restrict path, const char * restrict mode);
Run Code Online (Sandbox Code Playgroud)
一旦你有fopen()可用的声明,编译器就知道如何生成调用该函数的指令,链接器会将你的代码连接到库文件本身中的实际函数定义。所以当文中说到standard I/O library时,其实是在说库,同名的头文件只是一个辅助文件,可以让你访问库。
图书馆的定义已经演变/改变/更新似乎是一个合乎逻辑的结论......
不,这不是发生的事情;头文件和库一直是不同但相关的东西,自本书编写以来,其含义确实没有改变,至少就 C 而言。