【发布时间】:2019-04-09 06:23:15
【问题描述】:
预处理器的许多工作之一是写here:
包含头文件。这些是可以替换到您的程序中的声明文件。
头文件中的内容在我们的代码中使用之前是否经过词法分析器、语法分析器或语义分析器?如果不是,编译器如何在“程序员编写的代码”报错之前报头文件的任何错误?
【问题讨论】:
标签: compilation compiler-construction preprocessor lexical-analysis semantic-analysis
预处理器的许多工作之一是写here:
包含头文件。这些是可以替换到您的程序中的声明文件。
头文件中的内容在我们的代码中使用之前是否经过词法分析器、语法分析器或语义分析器?如果不是,编译器如何在“程序员编写的代码”报错之前报头文件的任何错误?
【问题讨论】:
标签: compilation compiler-construction preprocessor lexical-analysis semantic-analysis
没有。预处理器只是将包含的文件插入到您的代码中,然后对生成的“大 blob”进行词法分析等。
实际上,预处理器可能不会创建整个“大块”,它只是对其进行词法分析以创建一个令牌流,该流可以馈送到编译的后期阶段。
大多数编译器都会让您生成“大 blob”(gcc 使用 -E 选项) - 这将创建一个文件,其中包含您的所有代码和所有包含的代码,可能还有一些额外的“cpp 添加”标记,例如来自原始文件等以帮助报告错误。
包含文件的错误首先出现的原因是编译器首先遇到它们。
【讨论】:
-E 调用gcc 来查看预处理器的作用。您会注意到,除了逐字包含所有内容外,预处理器还会注释行号和源文件路径,因此接下来的阶段(词法分析、解析、语义分析等)仍会报告正确的位置。
预处理器还将解释预处理器指令以确定要包含哪些文件以及该文件的哪些部分,然后传递大 blob。
【讨论】: