【问题标题】:How Does the Preprocessor Process "#include" Directives?预处理器如何处理“#include”指令?
【发布时间】:2015-01-08 18:55:27
【问题描述】:

当预处理器在源代码中遇到#include 指令时,它究竟做了什么?

我假设它将#include 替换为包含文件的内容,但我想要比我的假设更强大的东西。

除了看起来更好看之外,还有什么理由不直接将包含文件的内容输入源代码而不是#include?

【问题讨论】:

  • 在 Google 上很容易找到答案,但由于我在 Stack Overflow 上找不到答案,所以我决定直接问。如果这是一个错误的决定,我很抱歉(或者如果我只是错过了一个包含对此答案的非常大胆的问题)。
  • 公平地说,我从未真正验证过它,但它会将内容复制粘贴(包含)到文件中。这就是为什么你需要包含警卫之类的东西。
  • 啊,问你在谷歌上找到的东西很好,用写得很好的答案回答你自己的问题也很好。不过,最好让问题更简洁。
  • C 标准中描述了词法转换规则,在这里您可以轻松满足您对形式的所有好奇心。
  • @ShayHacohen:我不确定 SO 是否是复制粘贴大量标准语言的好地方。 cppreference 之类的东西似乎更适合这项任务。

标签: c include c-preprocessor


【解决方案1】:

预处理器会将#include 语句替换为文件的内容。

使用#include而不是简单的粘贴文件内容的好处是,如果修改了头文件,你只需要重新编译源文件即可。如果您粘贴了文件的内容,那么您将不得不将其替换为新版本的头文件。

另外,如果您#include 一个文件位于多个位置(就像常量和类型定义文件一样),您不必修改所有重复的声明,多次包含的文件会更改一个位置而不是多个位置。

【讨论】:

    【解决方案2】:

    来自我的 C11 标准草案第 6.10.2 节第 3 段的副本

    表单的预处理指令

    # include "q-char-sequence" new-line

    导致该指令被由 "分隔符之间的指定序列。

    【讨论】:

      【解决方案3】:

      这就是#include 文件的意义所在。

      以#include <stdio.h> 为例,它是一个分布式库头文件。如果您有一套项目源文件,您可能必须将stdio.h 的内容粘贴到每个源文件中。 #include 文件的全部意义在于您不必这样做。

      现在取#include "mycommon.h",这是你本地常用的项目函数。如果您每次修改本地 mycommon.h 时不使用 #include,则必须将其重新粘贴到所有源文件中。

      【讨论】:

        【解决方案4】:

        有什么理由不直接在源代码中输入包含文件的内容而不是#include 它,除了它看起来更好吗?

        这不是一件容易的事。

        头文件的主要目的是为在单独的翻译单元中定义的函数原型和数据对象提供通用声明。大多数重要的应用程序都包含多个模块,这些模块位于单独的翻译单元中,分别编译和链接。一个函数或数据对象只能在一个翻译单元中定义,但可以在多个翻译单元中被引用——所有这些都必须有一个正确匹配的声明,链接才能成功.确保声明在每个翻译单元中正确的最简单和最不容易出错的方法是使用头文件;在多个翻译单元中输入相同的信息将很难维护。

        另一方面,如果您的翻译单元包含只能在该翻译单元内访问的函数和数据(或者您的应用程序是单个翻译单元),那么相应的声明可能确实出现在同一个源文件中,并且还应该声明为static 以明确禁止外部链接。

        以标准库头文件为例,例如 stdio.h。例如,您可以在代码中直接输入 printf() 的原型 - 它可能如下所示:

        extern int printf ( const char * format, ... );
        

        但您必须每次都完全正确,并针对您希望使用的每个功能执行此操作。你真的会这样做吗!?

        【讨论】:

          猜你喜欢
          • 2017-02-11
          • 1970-01-01
          • 1970-01-01
          • 2010-10-01
          • 1970-01-01
          • 2019-07-08
          • 1970-01-01
          相关资源
          最近更新 更多