为什么我不需要在头文件中包含library.c ++?

时间:2013-07-30 19:17:21

标签: c++ header libraries

我对图书馆有疑问。当我写一个库时,我有两个文件:library.hlibrary.cpp

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

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

5 个答案:

答案 0 :(得分:10)

简要解释:

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

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

(3)library.h的内容字面上被复制到library.cpp文件中。

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

因此,所有"原型&#34>在标题中复制到实现文件的顶部。编译和链接.cpp个文件。头文件本身是而不是编译的 - 它们的内容被复制到.cpp文件中。

答案 1 :(得分:1)

预处理器将头文件拉入CPP文件,因此编译器会同时看到原型和定义。

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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

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