Compiler construction 链接和预处理

Compiler construction 链接和预处理,compiler-construction,linker,preprocessor,Compiler Construction,Linker,Preprocessor,我正在阅读编译过程的不同阶段。当我到达链接阶段时,我发现它将库和用户定义的对象文件链接成一个exe文件。但是预处理已经用它的内容(即printf等函数的定义)取代了语句#include。 我知道我在某个地方错了,但我错理解了什么 库头通常只声明函数,不定义函数。如果查看.h文件内部,您将看到类似的内容(使用我们的示例) 尽管在许多实现中,这些声明被其他宏所掩盖 该声明只是说,在其他地方存在一个名为printf的函数,该函数以指向字符的点作为参数,后跟数量可变的未指定参数 这允许编译器检查代码中对

我正在阅读编译过程的不同阶段。当我到达链接阶段时,我发现它将库和用户定义的对象文件链接成一个exe文件。但是预处理已经用它的内容(即printf等函数的定义)取代了语句#include
我知道我在某个地方错了,但我错理解了什么

库头通常只声明函数,不定义函数。如果查看.h文件内部,您将看到类似的内容(使用我们的示例)

尽管在许多实现中,这些声明被其他宏所掩盖

该声明只是说,在其他地方存在一个名为printf的函数,该函数以指向字符的点作为参数,后跟数量可变的未指定参数

这允许编译器检查代码中对printf的调用是否符合函数的调用顺序

除非您自己编写printf并将其包含在代码中,否则编译程序时将不会有printf


当您链接(或在某些编译器中,以自动调用链接器的方式调用编译器)时,链接器将在指定的库中搜索包含printf的库,并将其与代码一起包含在可执行文件中(忽略共享库)。

头文件的可能副本不包括函数的定义,只有声明。现在我明白了。在前面,我认为头文件包含了所有的定义,就像我在使用某些指定函数时包含stdio.h一样。
 extern int printf (const char *fmt, ... ) ;