为了账号安全,请及时绑定邮箱和手机立即绑定

为什么有头文件和.cpp文件?

为什么有头文件和.cpp文件?

C++ C
沧海一幻觉 2019-06-03 10:25:10
为什么有头文件和.cpp文件?为什么C+有头文件和.cpp文件?
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

主要原因是接口与实现分离。头文件声明“什么”类(或任何正在实现的)将做什么,而CPP文件定义“如何”它将执行这些特性。

这减少了依赖关系,这样使用标头的代码就不一定需要知道实现的所有细节,以及只需要知道实现所需的任何其他类/头。这将减少编译时间,以及在实现中的某些内容发生变化时所需的重新编译量。

这并不完美,你通常会求助于一些技巧,比如PIMPL成语正确地分离接口和实现,但这是一个很好的开始。


查看完整回答
反对 回复 2019-06-03
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

C+编译

C+编译分为两个主要阶段:

  1. 第一种方法是将“源文件”文本文件编译成二进制“对象”文件:CPP文件是已编译的文件,编译时不知道其他CPP文件(甚至库),除非通过原始声明或头包含将文件提供给它。CPP文件通常被编译成.obj或.o“Object”文件。

  2. 第二种方法是将所有“对象”文件链接在一起,从而创建最终的二进制文件(库或可执行文件)。

在所有这些过程中,HPP适合哪里?

一个可怜的孤独的CPP文件.。

每个CPP文件的编译独立于所有其他CPP文件,这意味着如果A.CPP需要在B.CPP中定义一个符号,例如:

// A.CPPvoid doSomething(){
   doSomethingElse(); // Defined in B.CPP}// B.CPPvoid doSomethingElse(){
   // Etc.}

它不会编译,因为A.CPP无法知道“doSomeingElse”的存在.除非A.CPP中有声明,例如:

// A.CPPvoid doSomethingElse() ; // From B.CPPvoid doSomething(){
   doSomethingElse() ; // Defined in B.CPP}

然后,如果有使用相同符号的C.CPP,则复制/粘贴声明.

复制/粘贴警报!

是的,有个问题。复制/粘贴是危险的,很难维护。这意味着如果我们有办法不复制/粘贴,并且仍然声明符号.我们怎么做呢?包含一些文本文件,通常后缀为.h、.hxx、.h+,或者,我更喜欢C+文件.hpp:

// 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工作?

本质上,包含一个文件将解析并复制将其内容粘贴到cpp文件中。

例如,在下面的代码中,使用了A.HPP标题:

// A.HPPvoid someFunction();void someOtherFunction();

..资料来源B.CPP:

// B.CPP#include "A.HPP"void doSomething(){
   // Etc.}

..将在纳入后成为:

// B.CPPvoid someFunction();void someOtherFunction();void doSomething(){
   // Etc.}

一件小事-为什么在B.CPP中包括B.HPP?

在当前情况下,这是不需要的,B.HPP具有doSomethingElse函数声明,而B.CPP具有doSomethingElse函数定义(它本身就是一个声明)。但在更一般的情况下,B.HPP用于声明(和内联代码),可能没有相应的定义(例如枚举、普通结构等),因此如果B.CPP使用B.HPP的声明,则可能需要包含。默认情况下,源包含其标题是“不错的选择”。

结语

因此,头文件是必要的,因为C+编译器无法单独搜索符号声明,因此,您必须通过包含这些声明来帮助它。

最后一句话:您应该在您的HPP文件的内容周围设置头保护,以确保多个包含不会破坏任何东西,但总而言之,我相信HPP文件存在的主要原因已经在上面解释过了。

#ifndef B_HPP_#define B_HPP_// The declarations in the B.hpp file#endif // B_HPP_


查看完整回答
反对 回复 2019-06-03
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

因为C是这个概念起源的地方,它有30年的历史,而那时,它是将多个文件中的代码链接在一起的唯一可行的方法。

今天,这是一个可怕的黑客,它完全破坏了C+中的编译时间,导致了无数不必要的依赖(因为头文件中的类定义暴露了太多关于实现的信息),依此类推。


查看完整回答
反对 回复 2019-06-03
  • 3 回答
  • 0 关注
  • 727 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信