#including标准库如何工作?

时间:2013-03-16 17:10:37

标签: c io linker include c-preprocessor

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

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

3 个答案:

答案 0 :(得分:4)

正如其名称所示,预处理器是在编译器之前运行的程序。它只是简单的文本替换。

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

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

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

通常,程序的编译可分为以下步骤:

  1. 编辑
  2. 预处理
  3. 编译器
  4. 链接器
  5. 编辑步骤就是您创建源的步骤。

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

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

答案 1 :(得分:2)

  

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

只有标题文件#include

  

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

标准库标题仅包含声明。函数的定义(实现)位于库文件中,很可能是/usr/lib/libc.ext({{1是一个依赖于操作系统的扩展。)

答案 2 :(得分:1)

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