【问题标题】:What does #include actually do?#include 实际上做了什么?
【发布时间】:2011-04-20 19:09:37
【问题描述】:

在 C(或基于 C 的语言)中,可以愉快地使用以下语句:

#include "hello.h";

瞧,hello.h 中的每个函数和变量都是自动可用的。

但它实际上做了什么?我浏览了编译器文档和教程,并花了一些时间在网上搜索,但我对神奇的#include 命令形成的唯一印象是它“复制粘贴”了hello.h 的内容而不是那一行。肯定不止这些。

【问题讨论】:

  • 如果有任何安慰,预处理器还可以插入特定于实现的注释,以便如果/当生成调试信息时,它会正确获取行号。如果它确实具有复制粘贴的效果,则调试器将不知道“真实”源文件和行号。此外,__FILE__ 和 __LINE__ 必须像在复制粘贴之前一样被替换。不过,就程序的意义而言,就是复制粘贴。

标签: c include


【解决方案1】:

从逻辑上讲,复制/粘贴正是发生的事情。恐怕没有更多的了。不过,您不需要;。

规范中涵盖了您的具体示例,6.10.2 源文件包含部分,第 3 段:

表单的预处理指令

# include "q-char-sequence" 换行

用"分隔符之间的指定序列标识的源文件的全部内容替换该指令。

【讨论】:

    【解决方案2】:

    这(复制/粘贴)正是#include "header.h" 所做的。

    请注意,#include <header.h> 或编译器找不到文件 "header.h" 并尝试使用 #include <header.h> 时会有所不同。

    【讨论】:

    • “不同”只是因为它通常在不同的地方搜索,并且在心理上与(标准)库头相关联。
    • @delnan,它们根本不必不同 - 根据规范,所有搜索都以“实现定义”的方式执行。不同之处在于"" 表单在不起作用时会退回到<> 表单。 @pmg 完全正确。
    • 也“不同”,因为当您执行 #include <thing.h> 时,不需要名为 "thing.h" 的文件。
    【解决方案3】:

    不是真的,不。编译器将原始文件描述符保存在堆栈上并打开#included 文件;当它到达该文件的末尾时,它会关闭它并弹回原始文件描述符。这样,它几乎可以任意嵌套#included 文件。

    【讨论】:

    • gcc 中的编译器传递例如对#include 一无所知,因为它是预处理器传递。
    • @fazo:在大多数情况下,那里的区别是没有意义的。如果你出于某种原因需要迂腐,我可以去挖掘一个不完整的编译器列表,以及它们是否使用预处理器。
    【解决方案4】:

    # include 语句“吸引”预处理器(实际编译程序之前发生的过程)并“告诉”预处理器包含# include 语句之后的任何内容。

    虽然可以告诉预处理器做很多事情,但在这种情况下,它被要求识别头文件(在该头文件的名称后面用.h 表示,表示它是一个头文件) .

    现在,头文件是包含 C 声明和未在代码中明确定义的函数定义的文件。这是什么意思?好吧,如果你想使用一个函数或定义一个特殊类型的变量,并且你知道这些函数/定义是在其他地方定义的(比如标准库),你可以只包含(# include)你知道的头文件包含你需要的东西。否则,每次您想使用打印功能(如您的情况)时,您都必须重新创建打印功能。

    如果它没有在你的代码中明确定义并且你没有#include你正在使用的函数的头文件,你的编译器会抱怨说:“嘿!我看不到在哪里这个函数是定义的,所以我不知道你的代码中这个未定义的函数怎么办!".

    【讨论】:

      【解决方案5】:

      它是预处理器的一部分。看看http://en.wikipedia.org/wiki/C_preprocessor#Including_files。是的,它只是复制和粘贴。

      【讨论】:

        【解决方案6】:

        这是回答这个问题的一个很好的链接。

        http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx

        通常#include 和#include "path-name" 只是预处理器的搜索顺序不同

        【讨论】:

          猜你喜欢
          • 2013-06-02
          • 2020-11-21
          • 2015-02-26
          • 2017-06-29
          • 2013-06-13
          • 2021-10-25
          • 2011-08-12
          • 1970-01-01
          • 2010-11-27
          相关资源
          最近更新 更多