0

我的基本问题是编译过程如何使用标准库例程。当我 #include <stdio.h>C中时,预处理器是否会获取整个标准库并将其粘贴到我的源文件中?

如果是这样,当我使用库例程时,链接器是如何参与的?

4

3 回答 3

4

预处理器,顾名思义,是在编译器之前运行的程序。它所做的只是简单的文本替换。

找到#include指令后,它只需将整个文件“粘贴”到指令所在的位置。这同样适用于宏扩展,当检测到宏“调用”时,宏的主体被“粘贴”到它的位置。

预处理器与库无关。只是 C(和 C++)需要在使用之前声明其所有函数和变量,因此将声明放在预处理器包含的头文件中是从库中获取这些声明的简单方法。

基本上有两种类型的库:仅标头库和需要链接的库。第一种类型,仅头文件库,正如其名称所暗示的那样:它们完全包含在您包含的头文件中。但是,绝大多数库都是您需要链接的库。这是在编译器完成其工作后的一个步骤中由一个特殊程序完成的。当然,如何使用它取决于环境。

一般来说,一个程序的编译可以分为以下几个步骤:

  1. 编辑
  2. 预处理器
  3. 编译器
  4. 链接器

编辑步骤是您创建源代码的过程。

预处理器和编译步骤通常放在一个步骤中,这可能是初学者对预处理器真正做什么感到困惑的原因。

最后一步,链接,是从编译器获取输入,并将其与您指定的库一起使用以创建最终的可执行文件。

于 2013-03-16T17:15:47.273 回答
2

当我在 C 中使用 include 时,预处理器是否会获取整个标准库并将其粘贴到我的源文件中?

只有你的头文件#include

如果是这样,当我使用库例程时,链接器是如何参与的?

标准库头文件只包含声明。函数的定义(实现)在库文件中,很可能/usr/lib/libc.extext是依赖于操作系统的扩展)。

于 2013-03-16T17:14:02.610 回答
1

当您在源代码中#include 某些内容时,预处理器会将您#include 的任何内容粘贴到源文件中。但具体来说,如果您包含库中的头文件,您只是包含函数声明,如void a();,链接器会在库本身中找到这些函数的实现。

于 2013-03-16T17:14:39.733 回答