4

我有一个关于图书馆的问题。当我编写一个库时,我有 2 个文件:library.hlibrary.cpp.

第一个包含函数的原型,第二个包含定义。好吧,在library.cppI include#include "library.h"中,它们以一种方式连接,但是标题会发生什么?为什么我不必#include "library.cpp"在标题中写?

当我在主文件中使用库时,我编写#include "library.h"了包含原型的库,但是编译器如何知道定义在哪里?

4

5 回答 5

13

简要说明:

(1) 你的library.cpp文件被发送到预处理器。

(2) 预处理器读取该行#include "library.h"并找到文件library.h

(3) 的内容按library.h字面意思复制到library.cpp文件中。

(4)library.cpp编译文件并与主文件链接。

因此,头文件中的所有“原型”都被复制到实现文件的顶部。.cpp文件被编译和链接。头文件本身没有被编译——它们的内容被复制到.cpp文件中。

于 2013-07-30T19:34:08.633 回答
1

预处理器将头文件拉入 CPP 文件,因此编译器将原型和定义一起查看。

如果要将 CPP 文件拉到头文件中,则可以将预处理器发送到无限循环中,或者使用

#ifndef __FOOBAR__  
#define __FOOBAR__  
(code file)  
#endif

在标题和源文件周围,您只需读取一次文件。

于 2013-07-30T19:25:39.793 回答
1

有一个名为链接器的工具负责链接您生成的目标文件。您应该寻找编译过程以更好地理解它。

于 2013-07-30T19:27:07.750 回答
0

所有的cpp文件都是单独编译的,代码在某处堆积成一大堆。链接器收集代码中的所有符号,并在这堆中为它们分配一个地址。因此,尽管您的文件没有直接看到 library.cpp,但它知道 library.h 中的符号和分配的地址。然后它可以直接放大到大堆中所需的代码。不是我所知道的最技术性的答案..

于 2013-07-30T19:24:16.990 回答
-1

我的理解是,当您输入#include "library.h"代码时,编译器也设置为加载 library.cpp。我在学校被教导说,除非您使用编译器命令或适合您正在使用的系统(Windows、*nix、MacOS、 ETC。)

您必须输入#include "library.h"library.cpp 文件,因为这是存储函数原型的地方。您可以“作弊”并将函数原型放在 .cpp 文件中,然后键入#include "library.cpp",但这是不好的做法,编程社区通常不鼓励这样做。

于 2013-07-30T19:38:43.747 回答