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

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

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



沧海一幻觉
浏览 728回答 3
3回答

蝴蝶刀刀

主要原因是接口与实现分离。头文件声明“什么”类(或任何正在实现的)将做什么,而CPP文件定义“如何”它将执行这些特性。这减少了依赖关系,这样使用标头的代码就不一定需要知道实现的所有细节,以及只需要知道实现所需的任何其他类/头。这将减少编译时间,以及在实现中的某些内容发生变化时所需的重新编译量。这并不完美,你通常会求助于一些技巧,比如PIMPL成语正确地分离接口和实现,但这是一个很好的开始。

翻翻过去那场雪

C+编译C+编译分为两个主要阶段:第一种方法是将“源文件”文本文件编译成二进制“对象”文件:CPP文件是已编译的文件,编译时不知道其他CPP文件(甚至库),除非通过原始声明或头包含将文件提供给它。CPP文件通常被编译成.obj或.o“Object”文件。第二种方法是将所有“对象”文件链接在一起,从而创建最终的二进制文件(库或可执行文件)。在所有这些过程中,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_

猛跑小猪

因为C是这个概念起源的地方,它有30年的历史,而那时,它是将多个文件中的代码链接在一起的唯一可行的方法。今天,这是一个可怕的黑客,它完全破坏了C+中的编译时间,导致了无数不必要的依赖(因为头文件中的类定义暴露了太多关于实现的信息),依此类推。
打开App,查看更多内容
随时随地看视频慕课网APP