#include实际上做了什么?
在C(或基于C语言),一个可以愉快地使用以下语句:#include实际上做了什么?
#include "hello.h";
瞧,在每hello.h
函数和变量是自动地使用。
但它实际上做了什么?我浏览了编译器文档和教程,并花费了一些时间在线搜索,但我可以对神奇的#include
命令形成的唯一印象是它“复制粘贴”hello.h
的内容而不是该行。还有更多。
从逻辑上说,该复制/粘贴正是发生的情况。恐怕没有更多了。虽然你不需要;
。
你的具体例子是由规格所覆盖,部分6.10.2源文件包含,第3段:
形式的预处理指令
# include
"
Q-炭 - 序列"
新生线导致用
"
分隔符之间指定序列标识的源文件的全部内容替换该指令。
这(复制/粘贴)正是#include "header.h"
所做的。
请注意,#include <header.h>
或编译器无法找到文件"header.h"
而它试图改为#include <header.h>
时将会有所不同。
这是一个很好的链接来回答这个问题。
http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx
通常的#include和#包括“路径名”只是在不同的搜索预处理器
的“#包括”的顺序声明“抓住注意”前的 - 处理器(在你的程序实际编译之前发生的进程)和“告诉”预处理器包含“#include”语句后的任何内容。虽然预处理器可以被告知做了很多事情,但在这个例子中,它被要求识别一个头文件(在该头的名称后面用“.h”表示,表示它是头)。现在,头文件是一个包含C声明和未在代码中明确定义的函数定义的文件。这是什么意思?那么,如果你想使用一个函数或者定义一个特殊类型的变量,并且你知道这些函数/定义是在别处定义的(比如标准库),那么你可以包含(#include)你知道包含的头文件你需要什么。否则,每次你想使用打印功能(就像你的情况),你必须重新创建打印功能。如果它没有在你的代码中明确定义,并且你没有用你正在使用的函数#include头文件,你的编译器会抱怨说:“嘿!我没有看到这个函数被定义在哪里,所以我不用'不知道在你的代码中使用这个未定义的函数是什么!“。
如果有任何安慰,预处理器也可能插入特定于实现的注释,以便在生成调试信息时获取行号。如果它实际上具有复制粘贴的效果,则调试器将不知道“真实”源文件和行号。同样'__FILE__'和'__LINE__'必须在复制粘贴之前被替换。就程序的意义而言,虽然是复制粘贴。 – 2011-04-20 19:24:20