当我包含一个头文件时,比如说,
//myheader.h
#ifndef MY_HEADER_H
#define MY_HEADER_H
//....
#endif变成,
//mycpp1.cpp
#include "myheader.h"我被告知,当mycpp1.cpp包含myheader.h时,将定义MY_HEADER_H,因此任何再次包含它的尝试都将导致false。
现在,如果我想把它包含在mycpp2.cpp中。
//mpcpp2.cpp
#include "myheader.h"它是否会被包含在内,或者它是否会在第一次包含时使用相同的声明?
发布于 2011-12-03 13:31:31
每个文件的预处理器定义是分开的。因此,如果您将myheader.h #include到两个单独的.cpp文件中,它将被包含两次,而不是一次。每个.cpp一个。
发布于 2011-12-03 14:09:24
预处理器定义是当前编译单元的本地定义。
当然,也有复杂的情况,但重点是:
尝试将.cpp (源)文件视为不同的实体。如果你不做一些非常奇怪的事情,那么如果你删除了所有的.cpp文件,你仍然可以编译,因为在编译阶段,你不需要定义,你只关心东西的名称(声明)。
因此,在一次运行中编译N个源文件本质上是这样的:
[ *.H + SOURCE1.CPP ] --> SOURCE1.O
[ *.H + SOURCE2.CPP ] --> SOURCE2.O
...
[ *.H + SOURCEN.CPP ] --> SOURCEN.O其中每一行都是一个不同的编译单元,它将SourceX.CPP和包含的头文件呈现到一个目标文件中。所以我们得到了两个不同的东西。
这样,如果您不更改公共头文件,则不必重新编译未修改的源文件。当然,如果你修改一个源文件,你必须重新编译它。最后,如果您修改了一个公共头文件,那么您必须重新编译包含它的每个源文件。这里我不得不提一下,在编译阶段之前,所有的#inlude "filename.ext"行(预处理器指令)都将被替换为filename.ext文件的确切内容,无论它是什么。
然后链接是一个不同的问题,在那个阶段的目标是从这N个目标文件创建一个单独的文件。(我重复一遍,这是一个简单的例子)
这是链接:
[ SOURCE1.O + SOURCE2.O + ... + SOURCEN.O ] --> EXECUTABLE.FILE把受影响的目标文件想象成一个装满值和算法(函数定义)的袋子。例如,包中的某个地方必须恰好有一个main函数(定义),这样当您执行程序时,链接器肯定知道要做什么。
希望你拿到了
猜猜会发生什么,如果您将全局函数定义写入头文件中,然后将其包含在两个单独的编译单元中,然后尝试将它们链接起来。
答案是:链接器错误-多个定义,因为您可以单独编译它们。
发布于 2011-12-03 13:36:59
如果MY_HEADER_H仅在mycpp1.cpp中定义,则头文件将包含在mycpp2.cpp中
真正的诀窍是这样的:
header1.h包括header2.h。
因此,当您在mycpp.cpp中同时包含header1.h和header2.h时,如果您没有这样做,header2.h将包含两次。
https://stackoverflow.com/questions/8365736
复制相似问题