为什么我不需要在标题中包含库.cpp?
Why don't I need to include library.cpp in the header?
我有一个关于库的问题。当我写一个库时,我有两个文件:library.h
和library.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"
,但这是一种糟糕的做法,在编程社区中通常不鼓励这样做。
- 包含在.cpp文件中包含在 .h 文件时包含
- 如何在 C++ 的 .so 文件中包含库
- 如何在内核中添加包含库的路径?
- Arduino-Makefile:编译器无法编译用户库 cpp 文件
- 在基于命令行的QT插件构建中包含库
- 检查包含库C++的大小
- 在 C++ 中包含库数据库.txt文件时出错
- C++ 在虚幻引擎中包含库后重新定义类型
- 无法在Windows中找到来自cmake的MySQL和Boost包含/库
- 包含库,同时在 XCode 中以C++编码
- 如何在 CMake 项目中正确包含库
- 修改生成文件以包含库并使用 C++11
- 忽略来自 GDB(终端)中的包含/库文件的调试消息
- 在标题文件和CPP文件中都包含库
- 只有包含在标头中而不包含在cpp文件中时,标头才会抛出错误
- 将 Boost 标头包含在 .h 文件中但不包含在.cpp文件中时出错
- 在.cpp文件中包含库时
- 为什么我不需要在标题中包含库.cpp?
- 为什么我不能将静态库包含在 cpp 文件中?
- 如何告诉Visual Studio包含库的.cpp文件?