首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对包含头文件的混淆

对包含头文件的混淆
EN

Stack Overflow用户
提问于 2011-12-03 13:26:03
回答 5查看 176关注 0票数 2

当我包含一个头文件时,比如说,

代码语言:javascript
复制
//myheader.h
#ifndef MY_HEADER_H
#define MY_HEADER_H

//....

#endif

变成,

代码语言:javascript
复制
//mycpp1.cpp
#include "myheader.h"

我被告知,当mycpp1.cpp包含myheader.h时,将定义MY_HEADER_H,因此任何再次包含它的尝试都将导致false。

现在,如果我想把它包含在mycpp2.cpp中。

代码语言:javascript
复制
//mpcpp2.cpp
#include "myheader.h"

它是否会被包含在内,或者它是否会在第一次包含时使用相同的声明?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-03 13:31:31

每个文件的预处理器定义是分开的。因此,如果您将myheader.h #include到两个单独的.cpp文件中,它将被包含两次,而不是一次。每个.cpp一个。

票数 6
EN

Stack Overflow用户

发布于 2011-12-03 14:09:24

预处理器定义是当前编译单元的本地定义。

当然,也有复杂的情况,但重点是:

尝试将.cpp (源)文件视为不同的实体。如果你不做一些非常奇怪的事情,那么如果你删除了所有的.cpp文件,你仍然可以编译,因为在编译阶段,你不需要定义,你只关心东西的名称(声明)。

因此,在一次运行中编译N个源文件本质上是这样的:

代码语言:javascript
复制
[ *.H + SOURCE1.CPP ] --> SOURCE1.O
[ *.H + SOURCE2.CPP ] --> SOURCE2.O
...
[ *.H + SOURCEN.CPP ] --> SOURCEN.O

其中每一行都是一个不同的编译单元,它将SourceX.CPP和包含的头文件呈现到一个目标文件中。所以我们得到了两个不同的东西。

这样,如果您不更改公共头文件,则不必重新编译未修改的源文件。当然,如果你修改一个源文件,你必须重新编译它。最后,如果您修改了一个公共头文件,那么您必须重新编译包含它的每个源文件。这里我不得不提一下,在编译阶段之前,所有的#inlude "filename.ext"行(预处理器指令)都将被替换为filename.ext文件的确切内容,无论它是什么。

然后链接是一个不同的问题,在那个阶段的目标是从这N个目标文件创建一个单独的文件。(我重复一遍,这是一个简单的例子)

这是链接:

代码语言:javascript
复制
[ SOURCE1.O + SOURCE2.O + ... + SOURCEN.O ]  --> EXECUTABLE.FILE

把受影响的目标文件想象成一个装满值和算法(函数定义)的袋子。例如,包中的某个地方必须恰好有一个main函数(定义),这样当您执行程序时,链接器肯定知道要做什么。

希望你拿到了

猜猜会发生什么,如果您将全局函数定义写入头文件中,然后将其包含在两个单独的编译单元中,然后尝试将它们链接起来。

答案是:链接器错误-多个定义,因为您可以单独编译它们。

票数 4
EN

Stack Overflow用户

发布于 2011-12-03 13:36:59

如果MY_HEADER_H仅在mycpp1.cpp中定义,则头文件将包含在mycpp2.cpp中

真正的诀窍是这样的:

header1.h包括header2.h

因此,当您在mycpp.cpp中同时包含header1.hheader2.h时,如果您没有这样做,header2.h将包含两次。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8365736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档