#include实际上做了什么?

在C(或基于C语言)中,人们可以愉快地使用这个语句:

#include "hello.h"; 

而且, hello.h每个函数和变量hello.h可自动使用的。

但它实际上做了什么? 我查看了编译器文档和教程并花了一些时间在线搜索,但我可以形成关于神奇的#include命令的唯一印象是它“复制粘贴” hello.h的内容而不是那行。 不仅如此,还有更多。

从逻辑上讲,复制/粘贴正是发生的事情。 我担心它已经没有了。 你不需要; 但是。

您的具体示例包含在规范中,第6.10.2源文件包含 ,第3段:

表单的预处理指令

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

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

那(复制/粘贴)正是#include "header.h"作用。

请注意, #include 会有所不同,或者当编译器找不到文件"header.h" ,它会尝试#include

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

“#include”语句“抓住了预处理器的注意力”(在程序实际编译之前发生的过程)并“告诉”预处理器包含“#include”语句之后的任何内容。 虽然可以告诉预处理器做很多事情,但在这种情况下,它被要求识别一个头文件(在该头的名称后面用“.h”表示,表明它是一个头)。 现在,标头是一个包含C声明的文件和未在代码中明确定义的函数定义。 这是什么意思? 好吧,如果你想使用一个函数或定义一个特殊类型的变量,并且你知道这些函数/定义是在别处定义的(比如标准库),你可以只包括(#include)你知道包含的头文件你需要什么。 否则,每次你想使用打印function(如你的情况),你必须重新创建打印function。 如果它没有在您的代码中明确定义,并且您没有使用您正在使用的函数#include头文件,那么您的编译器会抱怨说“嘿!我看不到这个函数的定义,所以我不喜欢不知道在代码中使用这个未定义的函数该怎么做!“

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

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

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

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