#include实际上做了什么?

时间:2011-04-20 19:09:37

标签: c include

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

#include "hello.h";

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

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

6 个答案:

答案 0 :(得分:24)

逻辑上,复制/粘贴正是如此。我担心它已经没有了。但是,您不需要;

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

  

表单

的预处理指令      

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

     

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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

答案 5 :(得分:-1)

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

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

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