我正在阅读编译过程的不同阶段。当我到达链接阶段时,我发现它将库和用户定义的目标文件链接到一个以使其成为exe文件。但是预处理已经将语句 #include 替换为其内容(即printf等函数的定义)。 我知道我错了,但是我对错误理解了什么?
答案 0 :(得分:0)
库头文件通常只声明函数而不定义它。如果你查看.h文件,你会看到类似的东西(使用我们的例子)。
extern int printf (const char *fmt, ... ) ;
虽然在许多实现中,这些声明会被其他宏遮挡。
该声明只是说在其他地方存在一个名为printf的函数,它将一个点作为参数,后跟一个可变数量的未指定参数。
这允许编译器检查代码中对printf的调用是否符合已声明为函数调用序列的内容。
除非您自己编写printf并将其包含在代码中,否则在编译程序时将没有printf。
链接时(或者在某些编译器中,以自动调用链接器的方式调用编译器),链接器将在指定的库中搜索包含printf的库,并将代码包含在可执行文件中(忽略共享库) )。