我有一个关于图书馆的问题。当我编写一个库时,我有 2 个文件:library.h
和library.cpp
.
第一个包含函数的原型,第二个包含定义。好吧,在library.cpp
I include#include "library.h"
中,它们以一种方式连接,但是标题会发生什么?为什么我不必#include "library.cpp"
在标题中写?
当我在主文件中使用库时,我编写#include "library.h"
了包含原型的库,但是编译器如何知道定义在哪里?
简要说明:
(1) 你的library.cpp
文件被发送到预处理器。
(2) 预处理器读取该行#include "library.h"
并找到文件library.h
。
(3) 的内容按library.h
字面意思复制到library.cpp
文件中。
(4)library.cpp
编译文件并与主文件链接。
因此,头文件中的所有“原型”都被复制到实现文件的顶部。.cpp
文件被编译和链接。头文件本身没有被编译——它们的内容被复制到.cpp
文件中。
预处理器将头文件拉入 CPP 文件,因此编译器将原型和定义一起查看。
如果要将 CPP 文件拉到头文件中,则可以将预处理器发送到无限循环中,或者使用
#ifndef __FOOBAR__
#define __FOOBAR__
(code file)
#endif
在标题和源文件周围,您只需读取一次文件。
有一个名为链接器的工具负责链接您生成的目标文件。您应该寻找编译过程以更好地理解它。
所有的cpp文件都是单独编译的,代码在某处堆积成一大堆。链接器收集代码中的所有符号,并在这堆中为它们分配一个地址。因此,尽管您的文件没有直接看到 library.cpp,但它知道 library.h 中的符号和分配的地址。然后它可以直接放大到大堆中所需的代码。不是我所知道的最技术性的答案..
我的理解是,当您输入#include "library.h"
代码时,编译器也设置为加载 library.cpp。我在学校被教导说,除非您使用编译器命令或适合您正在使用的系统(Windows、*nix、MacOS、 ETC。)
您必须输入#include "library.h"
library.cpp 文件,因为这是存储函数原型的地方。您可以“作弊”并将函数原型放在 .cpp 文件中,然后键入#include "library.cpp"
,但这是不好的做法,编程社区通常不鼓励这样做。