【问题标题】:Compiler design preprocessing and compiling编译器设计预处理和编译
【发布时间】:2019-04-09 06:23:15
【问题描述】:

预处理器的许多工作之一是写here

包含头文件。这些是可以替换到您的程序中的声明文件。

头文件中的内容在我们的代码中使用之前是否经过词法分析器、语法分析器或语义分析器?如果不是,编译器如何在“程序员编写的代码”报错之前报头文件的任何错误?

【问题讨论】:

    标签: compilation compiler-construction preprocessor lexical-analysis semantic-analysis


    【解决方案1】:

    没有。预处理器只是将包含的文件插入到您的代码中,然后对生成的“大 blob”进行词法分析等。

    实际上,预处理器可能不会创建整个“大块”,它只是对其进行词法分析以创建一个令牌流,该流可以馈送到编译的后期阶段。

    大多数编译器都会让您生成“大 blob”(gcc 使用 -E 选项) - 这将创建一个文件,其中包含您的所有代码和所有包含的代码,可能还有一些额外的“cpp 添加”标记,例如来自原始文件等以帮助报告错误。

    包含文件的错误首先出现的原因是编译器首先遇到它们。

    【讨论】:

    • 如果不是,编译器如何在“程序员编写的代码”报错之前报头文件的任何错误?
    • 那么预处理器是否将头文件中的所有内容都包含到我的代码中?它会使整个内容变大对吗?
    • @john:如果您不要求 CPP 输出,gcc 不会生成它。在内部,预处理的结果是令牌流,而不是字符流。编译器肯定不会为预处理器输出创建临时文件。
    • 您可以通过使用选项-E 调用gcc 来查看预处理器的作用。您会注意到,除了逐字包含所有内容外,预处理器还会注释行号和源文件路径,因此接下来的阶段(词法分析、解析、语义分析等)仍会报告正确的位置。
    【解决方案2】:

    预处理器还将解释预处理器指令以确定要包含哪些文件以及该文件的哪些部分,然后传递大 blob。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 2019-04-29
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      相关资源
      最近更新 更多