3 回答
TA贡献1801条经验 获得超8个赞
主要原因是接口与实现分离。头文件声明“什么”类(或任何正在实现的)将做什么,而CPP文件定义“如何”它将执行这些特性。
这减少了依赖关系,这样使用标头的代码就不一定需要知道实现的所有细节,以及只需要知道实现所需的任何其他类/头。这将减少编译时间,以及在实现中的某些内容发生变化时所需的重新编译量。
这并不完美,你通常会求助于一些技巧,比如PIMPL成语正确地分离接口和实现,但这是一个很好的开始。
TA贡献2065条经验 获得超14个赞
C+编译
第一种方法是将“源文件”文本文件编译成二进制“对象”文件:CPP文件是已编译的文件,编译时不知道其他CPP文件(甚至库),除非通过原始声明或头包含将文件提供给它。CPP文件通常被编译成.obj或.o“Object”文件。 第二种方法是将所有“对象”文件链接在一起,从而创建最终的二进制文件(库或可执行文件)。
一个可怜的孤独的CPP文件.。
// A.CPPvoid doSomething(){ doSomethingElse(); // Defined in B.CPP}// B.CPPvoid doSomethingElse(){ // Etc.}
// A.CPPvoid doSomethingElse() ; // From B.CPPvoid doSomething(){ doSomethingElse() ; // Defined in B.CPP}
复制/粘贴警报!
// B.HPP (here, we decided to declare every symbol defined in B.CPP)void doSomethingElse() ;// A.CPP#include "B.HPP"void doSomething(){ doSomethingElse() ; // Defined in B.CPP}// B.CPP#include "B.HPP"void doSomethingElse(){ // Etc.}// C.CPP#include "B.HPP"void doSomethingAgain(){ doSomethingElse() ; // Defined in B.CPP}
如何 include
工作?
// A.HPPvoid someFunction();void someOtherFunction();
// B.CPP#include "A.HPP"void doSomething(){ // Etc.}
// B.CPPvoid someFunction();void someOtherFunction();void doSomething(){ // Etc.}
一件小事-为什么在B.CPP中包括B.HPP?
doSomethingElse
doSomethingElse
结语
#ifndef B_HPP_#define B_HPP_// The declarations in the B.hpp file#endif // B_HPP_
TA贡献1858条经验 获得超8个赞
- 3 回答
- 0 关注
- 727 浏览
添加回答
举报