为什么c++有头文件和。cpp文件?
当前回答
因为设计库格式的人不想为很少使用的信息(如C预处理器宏和函数声明)“浪费”空间。
因为你需要这些信息来告诉你的编译器“当链接器完成它的工作时,这个函数稍后可用”,他们必须拿出第二个文件来存储这些共享信息。
C/ c++之后的大多数语言将这些信息存储在输出中(例如Java字节码),或者它们根本不使用预编译的格式,总是以源代码形式分发并动态编译(Python, Perl)。
其他回答
主要原因是将接口从实现中分离出来。头文件声明了一个类(或任何正在实现的类)将做什么,而cpp文件定义了它将“如何”执行这些功能。
这减少了依赖关系,因此使用头文件的代码不一定需要知道实现的所有细节,也不需要知道为此所需的任何其他类/头文件。这将减少编译时间,以及当实现中的某些内容发生更改时所需的重新编译量。
它并不完美,您通常会求助于诸如Pimpl Idiom之类的技术来正确地分离接口和实现,但这是一个良好的开端。
通常情况下,您希望有一个接口的定义,而不必交付整个代码。例如,如果您有一个共享库,您将附带一个头文件,该文件定义了共享库中使用的所有函数和符号。如果没有头文件,则需要发布源代码。
在一个项目中,头文件至少有两个用途:
清晰性,即通过保持接口与实现分离,更容易阅读代码 编译时间。通过尽可能只使用接口,而不是完整的实现,可以减少编译时间,因为编译器可以简单地对接口进行引用,而不必解析实际代码(理想情况下,只需要一次完成)。
因为C语言是这个概念的发源地,它已经有30年的历史了,在当时,它是将多个文件中的代码链接在一起的唯一可行的方法。
今天,这是一个可怕的黑客,它完全破坏了c++中的编译时间,导致无数不必要的依赖关系(因为头文件中的类定义暴露了太多关于实现的信息),等等。
因为在c++中,最终的可执行代码不携带任何符号信息,它或多或少是纯机器代码。
因此,您需要一种方法来描述一段代码的接口,这种方法与代码本身是分开的。该描述在头文件中。
因为c++从C继承了它们。
推荐文章
- Linux有c++ gdb图形用户界面吗?
- 从标准输入中捕获字符,而不需要等待按enter键
- libpng警告:iCCP:已知错误的sRGB配置文件
- 为什么STL如此严重地基于模板而不是继承?
- 查找当前可执行文件的路径,不包含/proc/self/exe
- 未定义对静态constexpr char的引用[]
- 在c++中,restrict关键字是什么意思?
- c++中类似于java的instanceof
- include_directories和target_include_directories在CMake中的区别是什么?
- std::make_pair与std::pair的构造函数的目的是什么?
- 如何追加一个字符到std::字符串?
- 为什么要在c++中使用嵌套类?
- 如何处理11000行c++源文件?
- 使用g++编译多个.cpp和.h文件
- 如何在c++中追加文本到文本文件?