用头文件编程?

时间:2018-02-27 20:29:40

标签: c

如果头文件只是我使用#include时粘贴到另一个上的一段代码,那么什么阻止我使用.h文件在C编程?你甚至可以#include到其他头文件中!

我认为必须有一些性能或工作流原因,为什么这不常见,但如果它存在,我不知道它是什么。

因此,我的问题是:人们不使用头文件对整个应用程序进行编程的原因是什么?

4 个答案:

答案 0 :(得分:7)

头文件具有模块化的概念,即将大程序的源代码分成几个独立的部分,即翻译单元。因此,实现细节对于其他翻译单元是隐藏的,并且依赖性显着降低。但是:如果翻译单元A需要从另一个翻译B中调用一个函数,它需要具有相应函数的函数原型,即没有正文的函数 - 类似于int functionFromB(int x);以告诉编译器如何打电话给它。所以翻译单元A可以在开始时简单地编写这个原型;但是通常来自翻译单元B的函数(例如B.cpp)暴露在头文件B.h中,头文件{}包括函数原型形式的B的所有“公共”函数。同样适用于类型定义和(全局)变量。然后A只需要包含B.h以便拥有所有函数原型等。无需了解所有实现细节(如函数体)即可获得。

所以你可以在.h - 文件中完整地编写一个大程序;但你必须告诉编译器将它们视为翻译单元(通常只有.cpp - 文件被视为这样),你仍然需要提供函数原型等...

使用翻译单元,您可以使用单独/独立的模块。这与大型整体块形成对比,当您将程序的所有块“粘贴”在不同的.h文件上时,通过#include将它们“粘贴在一起”。您可以单独编译/测试/分发翻译单元,而单片块不能部分编译/测试/分发。

答案 1 :(得分:4)

当您需要跨不同文件引用代码或数据结构时,头文件是C和C ++的必需品,当需要链接到库和编译器的外部程序必须了解如何使用它时,这一点尤为重要。< / p>

将应用程序分解为一系列.c.cpp文件是有利的,这样可以提高编译过程的效率。大多数编译器环境(由Makefile驱动或IDE管理)都有方法可以检测在进行更改时需要重新编译哪些文件。

在较大的应用程序中构建所有文件可能需要相当长的时间,但重新编译单个.cpp文件通常相当快。只要您只更改.cpp源并且不触及标题,您就可以快速重新编译并重新链接,准备好立即进行测试。

如果您将所有内容放入头文件中,那么每次都需要重新编译所有内容,这可能是一个非常缓慢的过程。

请记住,某些代码库可能需要小时来重建,因此这不是一种可持续的做法。

答案 2 :(得分:2)

我想到了一个奇怪的比喻。

你去餐馆 服务员为您提供菜单。菜单是您与厨房的接口 你挑选想要订购的菜肴。

然后,

选项1:

服务员要求你搬到厨房,亲自看看菜肴是如何准备的。你一直待在厨房里,直到送给你食物。

选项2:

服务员在你不一定看到的厨房准备食物后把食物带到你的餐桌上。

您更喜欢哪一个?

将实现放在.h文件中类似于选项1。

将实现放在其他地方的.c / .cpp文件中类似于选项2。

答案 3 :(得分:1)

按照惯例,头文件与源文件不同。使用.h.hpp扩展名表示该文件旨在为#included,并不表示作为独立源文件存在。您通常可以假设.h / .hpp个文件可以安全地包含在多个源文件中。

与此同时,.c.cpp扩展程序表明该文件可能是翻译单位,不适合在其他翻译单元中#included

如果您真的想让自己和其他在代码库中工作的人感到困难,那么您可以很好地为每个具有任意扩展名的文件编写整个代码库,或者根本不写任何文件。