编译器中的哪个程序负责预处理器?
Which program in the compiler takes care of the preprocessors?
编译器是很多程序的组合。那么哪个程序在编译期间负责哪个部分呢?我在某处读到预处理器程序负责 C 预处理器指令(宏)。对吗?
没有说明编译器should/must内部是如何设计的,因此编译器与编译器之间会有所不同。
然而传统上,它们分为预处理器、编译器和链接器。它们可能在同一个可执行文件中,也可能在多个文件中。
预处理器会在编译器开始检查实际语言语法之前完成所有需要完成的工作。编译器正在检查源代码是否是有效的 C,这有意义吗?然后将源代码翻译成可执行程序,其行为符合C标准。
一些编译器以独立于硬件的形式提供输出"object file",在这种情况下,需要链接器将一个或多个目标文件翻译成机器代码。但是编译器也可以将输出作为机器代码给出,在这种情况下,链接器的唯一任务是将程序的所有不同部分(翻译单元)放在一起,包括库,并检查程序使用的所有标识符(变量、函数等)是否存在 - 如果不存在,您将收到链接器错误。
C 标准 (C17 5.1.1.2) 仅提及 translation phases,这主要是规定预处理的顺序。粗略地说,翻译阶段 1 到 6 就是我们所说的 "pre-processing",第 7 步是 "compiling",第 8 步是 "linking".
编译器是很多程序的组合。那么哪个程序在编译期间负责哪个部分呢?我在某处读到预处理器程序负责 C 预处理器指令(宏)。对吗?
没有说明编译器should/must内部是如何设计的,因此编译器与编译器之间会有所不同。
然而传统上,它们分为预处理器、编译器和链接器。它们可能在同一个可执行文件中,也可能在多个文件中。
预处理器会在编译器开始检查实际语言语法之前完成所有需要完成的工作。编译器正在检查源代码是否是有效的 C,这有意义吗?然后将源代码翻译成可执行程序,其行为符合C标准。
一些编译器以独立于硬件的形式提供输出"object file",在这种情况下,需要链接器将一个或多个目标文件翻译成机器代码。但是编译器也可以将输出作为机器代码给出,在这种情况下,链接器的唯一任务是将程序的所有不同部分(翻译单元)放在一起,包括库,并检查程序使用的所有标识符(变量、函数等)是否存在 - 如果不存在,您将收到链接器错误。
C 标准 (C17 5.1.1.2) 仅提及 translation phases,这主要是规定预处理的顺序。粗略地说,翻译阶段 1 到 6 就是我们所说的 "pre-processing",第 7 步是 "compiling",第 8 步是 "linking".