【问题标题】:Which program in the compiler takes care of the preprocessors? [closed]编译器中的哪个程序负责预处理器? [关闭]
【发布时间】:2018-08-29 08:58:37
【问题描述】:

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

【问题讨论】:

  • 虽然 C 编译器过去确实会受到一些较小程序的影响,但如今这种情况很少见。由于如何指定translation phases,它通常是一个程序。如果是这样,通常可以选择在预处理后停止。
  • "..C++ 源文件由编译器处理好像以下阶段发生,完全按照以下顺序:.." en.cppreference.com/w/cpp/language/translation_phases 好像 是这里的关键词,大多数编译器(现在)只是一个可执行文件。
  • 编译器可以选择只运行预处理器,或者至少保存预处理器输出,这也是很常见的。如果这就是您要查找的内容,请参阅编译器的文档。
  • 哦,虽然实际的编译器通常是单个程序,但直接调用它是不常见的。相反,有一个“前端”程序(如 GCC 的 gccg++)调用实际的编译器,然后可能是链接器。
  • 所有这些都特定于您正在使用的编译器。 C++ 标准都没有规定。

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


【解决方案1】:

没有说明编译器应该/必须在内部如何设计,因此编译器与编译器之间会有所不同。

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

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

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

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

【讨论】:

  • 大多数现代编译器生成汇编器输出,由汇编器 proram 汇编到目标文件文件
  • @P__J__:比如?只有 GCC 可以,AFAIK。这是一个缓慢的步骤,仅将指令的文本表示序列化,以便汇编程序将其转回二进制。例如,MSVC 不会打扰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多