我对图书馆有疑问。当我写一个库时,我有两个文件:library.h
和library.cpp
。
第一个包含函数的原型,第二个包含定义。好吧,在library.cpp
我包含#include "library.h"
,所以它们以一种方式连接,但是标题会发生什么?为什么我不必在标题中写#include "library.cpp"
?
当我在主文件中使用库时,我写了#include "library.h"
,其中包含原型,但编译器如何知道定义的位置?
答案 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"
,但这是不好的做法,通常不鼓励编程社区。 p>