Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
include实际上做什么?_C_Include - Fatal编程技术网

include实际上做什么?

include实际上做什么?,c,include,C,Include,在C语言(或基于C的语言)中,可以愉快地使用以下语句: #include "hello.h"; 瞧,hello.h中的每个函数和变量都是自动可用的 但它实际上做什么呢?我查阅了编译器文档和教程,花了一些时间在网上搜索,但我对神奇的#include命令的唯一印象是它“复制粘贴”了hello.h的内容,而不是那一行。肯定不止这些。从逻辑上讲,复制/粘贴正是发生的事情。恐怕没有更多的了。您不需要 规范第6.10.2节“源文件包含”第3段介绍了您的具体示例: 表单的预处理指令 #包括“q-char-s

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

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


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

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

规范第6.10.2节“源文件包含”第3段介绍了您的具体示例:

表单的预处理指令

#包括
q-char-sequence
新行

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

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


请注意,对于
#include
或编译器找不到文件
“header.h”时,它会有所不同“
,它会尝试
#包含

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

它是预处理器的一部分。看一看。是的,只是复制和粘贴。

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

通常#include和#include“路径名”在前处理器的搜索顺序上有所不同

语句
#include
会引起前处理器的注意(程序实际编译之前发生的进程)和“告知”包含
#include
语句后面的内容的预处理器

虽然可以告诉预处理器执行相当多的操作,但在本例中,要求它识别头文件(在该头文件的名称后面用
.h
表示,表示它是头文件)

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


如果您的代码中没有明确定义它,并且您没有
#将
头文件包含在您正在使用的函数中,编译器会抱怨说:“嘿!我看不出这个函数是在哪里定义的,所以我不知道如何在代码中使用这个未定义的函数!”

“不同”只是因为它通常在不同的位置进行搜索,并且在心理上与(标准)库标题相关联。@delnan,它们根本不必不同-根据规范,所有搜索都是以“实现定义”的方式执行的。区别在于
表单如果不起作用,则返回到
表单@pmg是完全正确的。也是“不同”的,因为当您执行
#include
时,不需要名为
“thing.h”
的文件。如果这是一种安慰,预处理器还可以插入特定于实现的注释,以便在生成调试信息时,它可以正确获得行号。如果它真的有复制粘贴的效果,调试器就不会知道“真正的”源文件和行号。此外,还必须在复制粘贴之前替换
\uuuuuuu文件
\uuuuuu行
。不过,就程序的意义而言,复制粘贴就是它。例如,gcc中的编译器传递对#include一无所知,因为它是预处理器传递。@fazo:在大多数情况下,这里的区别是没有意义的。如果你出于某种原因需要迂腐,我可以去查一个不完整的编译器列表,看看它们是否使用预处理器。