【问题标题】:Linking and Preprocessing链接和预处理
【发布时间】:2017-05-03 03:03:19
【问题描述】:

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

【问题讨论】:

标签: compiler-construction linker preprocessor


【解决方案1】:

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

 extern int printf (const char *fmt, ... ) ;

尽管在许多实现中,这些声明被附加的宏所掩盖。

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

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

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

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

【讨论】:

  • 现在我明白了。早些时候,我认为头文件包含所有定义,因为我曾经包含 stdio.h 以使用某些指定的函数。
猜你喜欢
  • 2013-11-10
  • 2017-10-21
  • 2018-11-30
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2018-10-22
相关资源
最近更新 更多