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