声明和定义存储在哪里?
Where are declaration and definition stored?
预定义函数的声明和定义存储在哪里?
声明是否存储在库中?如果是,那么为什么它被命名为库函数?
头文件包含内置函数的声明,库包含函数的定义。
之所以命名为library,是因为在我看来,作为包含书籍的实际图书馆,这些库包含类、函数、变量等
这是一个不精确的问题。我们可以给出的最佳答案是:
标准库函数的声明最好认为是保存在它们的头文件中
标准库文件的定义在这些库的源文件中(您可能看不到,这是您的编译器供应商的商业秘密),这取决于您的想法),或库文件本身(.a
、.so
、.lib
或 .dll
)。
如今,标准库函数的知识通常也内置于编译器中。例如,如果我写了经典的 int main() { printf("Hello, world!\n"); }
,但没有任何 #include
指令,我的编译器会说,"warning: implicitly declaring library function 'printf'" 和 "include the header <stdio.h>".
这个故事有两个方面:
- 调用 library/external 函数的代码:编译器在您编译的模块中生成一个引用,该引用对您希望在其他地方存在的函数原型进行编码。
- 您的代码必须链接到的预编译库文件:库文件包含其函数的编码原型以及这些函数的实际编译二进制文件(即 definition/implementation)。
当您的代码使用外部函数时,编译器会生成对该函数的引用,它假定稍后将在链接阶段解析该函数。
在函数引用的链接过程中,建立了列表。链接器希望找到每个使用的引用的 'definition'/实现。
预定义函数的声明和定义存储在哪里? 声明是否存储在库中?如果是,那么为什么它被命名为库函数?
头文件包含内置函数的声明,库包含函数的定义。
之所以命名为library,是因为在我看来,作为包含书籍的实际图书馆,这些库包含类、函数、变量等
这是一个不精确的问题。我们可以给出的最佳答案是:
标准库函数的声明最好认为是保存在它们的头文件中
标准库文件的定义在这些库的源文件中(您可能看不到,这是您的编译器供应商的商业秘密),这取决于您的想法),或库文件本身(
.a
、.so
、.lib
或.dll
)。如今,标准库函数的知识通常也内置于编译器中。例如,如果我写了经典的
int main() { printf("Hello, world!\n"); }
,但没有任何#include
指令,我的编译器会说,"warning: implicitly declaring library function 'printf'" 和 "include the header <stdio.h>".
这个故事有两个方面:
- 调用 library/external 函数的代码:编译器在您编译的模块中生成一个引用,该引用对您希望在其他地方存在的函数原型进行编码。
- 您的代码必须链接到的预编译库文件:库文件包含其函数的编码原型以及这些函数的实际编译二进制文件(即 definition/implementation)。
当您的代码使用外部函数时,编译器会生成对该函数的引用,它假定稍后将在链接阶段解析该函数。
在函数引用的链接过程中,建立了列表。链接器希望找到每个使用的引用的 'definition'/实现。