编译器中的哪个程序负责预处理器?

时间:2018-08-29 08:58:38

标签: c++ c macros c-preprocessor compiler-directives

编译器是许多程序的组合。那么哪个程序在编译过程中负责哪一部分呢?我在某处读到预处理程序负责C预处理程序指令(宏)。正确吗?

1 个答案:

答案 0 :(得分:1)

没什么好说的,应该/必须在内部设计编译器,因此编译器之间会有所不同。

传统上,它们分为预处理器,编译器和链接器。这些文件可能位于同一可执行文件中,也可能位于多个可执行文件中。

在编译器开始检查实际语言语法之前,预处理器会执行所有需要完成的工作。编译器正在检查源代码是否有效C,这有意义吗?然后将源代码转换为可执行程序,其行为符合C标准的规定。

某些编译器以与硬件无关的“目标文件”的形式提供输出,在这种情况下,需要一个链接器将一个或多个目标文件转换为机器代码。但是编译器也可以将输出作为机器代码提供,在这种情况下,链接器的唯一任务是将程序的所有不同部分(翻译单元)(包括库)放在一起,并检查是否该程序使用的所有标识符(变量,函数等)都存在-如果不存在,则会出现链接器错误。

C标准(C17 5.1.1.2)仅提及translation phases,这主要决定了预处理的顺序。大致来说,翻译阶段1至6是我们所说的“预处理”,步骤7是“编译”,步骤8是“链接”。