头文件带有模块化的概念,即将大型程序的源代码分成几个独立的部分,即翻译单元.因此,实现细节对于其他翻译单元是隐藏的,并且依赖性显着降低.但是:如果翻译单元A需要从另一个翻译B调用一个函数,它需要具有相应函数的函数原型,即没有正文的函数 - 就像int functionFromB(int x);告诉编译器如何调用它一样.所以翻译单元A可以在开始时简单地编写这个原型; 但是通常来自翻译单元B的功能(例如B.cpp)暴露在头文件中B.h,头文件包括功能原型形式的B的所有"公共"功能.同样适用于类型定义和(全局)变量.然后A可以包括B.h以便具有所有功能原型等.可用,无需了解所有实现细节(如函数体).
所以你可以在.h-files中完整地编写一个大程序; 但是你必须告诉编译器将它们视为翻译单元(通常只有.cpp-files被视为这样),你仍然需要提供函数原型等...
使用翻译单元,您可以使用单独/独立的模块.这是相对于一个大的整块,当你"粘贴"你的计划,分布在不同的所有块,你得到.h的-files #include-ing他们"在一起".您可以单独编译/测试/分发翻译单元,而单片块不能部分编译/测试/分发.
当您需要跨不同文件引用代码或数据结构时,头文件是 C 和 C++ 的必需品,当需要链接库的外部程序并且编译器必须了解如何使用它时,头文件尤其重要。
将您的应用程序分解为一系列.c或.cpp文件以提高编译过程的效率是有利的。大多数Makefile由驱动或 IDE 管理的编译器环境都有检测哪些文件在发生更改时需要重新编译的方法。
在较大的应用程序中,构建所有文件可能需要相当长的时间,但重新编译单个.cpp文件通常相当快。只要您只更改.cpp源代码并且不触及标头,您就可以快速重新编译和重新链接,以便立即进行测试。
相反,如果您将所有内容都放入头文件中,那么您每次都需要重新编译所有内容,这可能是一个非常缓慢的过程。
请记住,某些代码库可能需要数小时才能重建,因此这不是一种可持续的做法。