【问题标题】:What will be replaced with this statement?该声明将取代什么?
【发布时间】:2017-12-23 04:51:24
【问题描述】:

语句在文件中:

#include "filename"

这个文件什么时候会被它的内容替换?

  1. 编译前

  2. 编译后

  3. 执行期间

【问题讨论】:

  • 嘿?您是否跳过了书中的预处理章节?
  • 问题的标题与问题本身不匹配。
  • 编译 C 程序是一个多阶段的过程。在概述级别上,该过程可以分为四个独立的阶段:预处理、编译、组装和链接。包含在预处理阶段解决。
  • 我正在研究它,但是在完成构建过程后我对此感到困惑。

标签: c c-preprocessor preprocessor preprocessor-directive


【解决方案1】:

如果严格遵循 C 标准中的这个描述(即不使用“编译”一词)(5.1.1 翻译环境,5.1.1.1 程序结构)

1 C 程序不必同时翻译。的文本 程序保存在称为源文件的单元中,(或预处理 文件)在本国际标准中。 源文件连同 通过预处理包含的所有头文件和源文件 指令#include 被称为预处理翻译单元。 经过预处理后,一个预处理翻译单元被称为 翻译单元以前翻译过的翻译单元可能是 单独或在图书馆保存。独立的翻译单元 的程序通过(例如)调用其函数进行通信 标识符具有外部链接,对对象的操作 标识符具有外部链接或对数据文件的操作。 翻译单元可以单独翻译,然后再链接到 生成一个可执行程序。

所以在预处理期间但在翻译之前,所有#includes 都被替换为源文件。

【讨论】:

    【解决方案2】:

    预处理在编译的其他阶段之前执行,但大多数现代编译器将预处理阶段作为编译过程的一部分。

    这个问题是近似的:

    • 如果你只有 3 个选择,那么预期的答案可能是 1。

    • 如果你可以选择以上都不是,那么你就有麻烦了,因为你无法确定这个问题是愚蠢的还是微妙的。

    • 如果这是一个面试题,你可以在这里告诉面试官你对编译过程、解析阶段等的所有了解。时间限制将在主题用尽之前达到。

    【讨论】:

    • ..除非 NOTA 是隐藏选项 ;)
    • @chqrlie “如果这是一个面试问题,那么你有机会告诉面试官你...想想他。”:)
    • @VladfromMoscow:OP 需要研究编译过程,需要很长时间才能掌握其中的每一个细节,大多数程序员永远不会,但了解基础知识是有用的,并在这里演示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2019-11-25
    • 1970-01-01
    相关资源
    最近更新 更多