为什么我不需要在标题中包含库.cpp?

Why don't I need to include library.cpp in the header?

本文关键字:包含库 cpp 标题 不需要 为什么      更新时间:2023-10-16

我有一个关于库的问题。当我写一个库时,我有两个文件:library.hlibrary.cpp

第一个包含函数的原型,第二个包含定义。好吧,在library.cpp中,我包括#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

围绕头AND源文件,您只需读取该文件一次。

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

我的理解是,当你在代码中键入#include "library.h"时,编译器也会设置为加载library.cpp。我在学校里被教导,除非你使用编译器命令或适合你使用的系统(Windows、*nix、MacOS等)的makefile手动编译和链接每个文件,否则没有任何方法可以破坏这种连接。

您必须在library.cpp文件中键入#include "library.h",因为函数原型存储在那里。您可以"欺骗"并将函数原型放在.cpp文件中,只需键入#include "library.cpp",但这是一种糟糕的做法,在编程社区中通常不鼓励这样做。