预处理定义是本地当前编译单元。
当然也有复杂的情况,但这里是点:
尝试看看的.cpp(源)文件作为独立的实体。 如果你没有做出奇怪的事情,那么 如果你删除除了你打扰的所有.cpp文件,你可以stil编译,因为在编译阶段不需要 的定义,你只关心名称(事情声明)。
因此,在一个运行编译N个源文件基本上是这样的:
[ *.H + SOURCE1.CPP ] --> SOURCE1.O
[ *.H + SOURCE2.CPP ] --> SOURCE2.O
...
[ *.H + SOURCEN.CPP ] --> SOURCEN.O
其中每一行是一个明显的编译单元,其 呈现SourceX.CPP和所包括的报头为对象文件。 所以我们来到这里N个独立的事情。
这样,如果您不更改常用标题,那么您不必 重新编译未修改的源文件。当然,如果你修改了一个源文件, 你必须重新编译。最后,如果你修改了一个公共的头,那么你必须 重新编译,包括它的每一个源文件。 这里我不得不提,那编译阶段之前,所有 #inlude "filename.ext"
线(预处理指令)将与FILENAME.EXT文件的具体内容,不管它是取代 。
然后连接是不同的问题,在该阶段的 目标是创建从N个目标文件一个单一的文件。 (我再说一遍,这是简单的例子)
这是链接:
[ SOURCE1.O + SOURCE2.O + ... + SOURCEN.O ] --> EXECUTABLE.FILE
试想影响了目标文件作为值的包和 算法(函数定义)。例如,包里的某个地方必须有一个 main
函数(定义),所以链接器肯定会知道在执行程序时要做什么 。
希望你得到它
猜猜会发生什么,如果你写一个全局函数的定义放在一个头文件, 然后你将其包含在两个不同的编译单元,然后尝试将它们连接。
答案:链接器错误 - 多个定义,因为你可以单独编译它们。
多数民众赞成在我的猜测是..有什么办法,我可以检查,看看它是否包括两次? – user103214
@ user974191您可以在预处理器完成后查看文件,但您为什么要这样做? –
你的意思是目标文件吗?没有什么只是试图了解发生了什么。 – user103214