c - #including 标准库是如何工作的?

标签 c io linker include c-preprocessor

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

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

最佳答案

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

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

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

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

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

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

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

预处理器和编译步骤通常放在一个步骤中,这可能就是为什么初学者对预处理器的真正作用有些困惑的原因。

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

关于c - #including 标准库是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15452166/

相关文章:

c - 使用 `sleep()` 进行时间延迟

linux - 在 Linux 中使用 --image-base 确保程序加载低于 4 GB

c++ - cmake find_package 指定路径

c++ - 如何使用 Clang 在 macOS 上链接核心框架?

c - 指向 GCC 目标内置函数的函数指针(有时)会产生链接错误

c - 指向函数错误的指针

c - 在 gdb 调试器中找不到调试符号

Java 8 FilterOutputStream 异常

java - 在java中搜索大量文件的内容

java - Android 填充 ArrayList 时的性能问题