我不太理解具有头部的点; 这似乎违背了DRY原则! 是(可以)包含在实施头的所有信息。
Answer 1:
它简化了编译过程。 当你想单独编译单元,你需要一些东西来描述将要连接到的部分,而无需导入所有其他文件的全部。
它还允许代码隐藏。 人们可以分发头允许他人使用的功能,而无需发布实施。
最后,它可以鼓励接口从实现分离。
他们不是解决这些问题的唯一途径,但在30年前,他们是一个很好的一个。 我们可能不会使用头文件为今天的语言,但他们并没有在2009年发明的。
Answer 2:
许多现代语言如Java,Eiffel和C#的建筑师明确同意你的看法 - 这些语言来提取元数据有关从实施的模块。 然而,本身标题的概念不排除-这显然是一个编译器提取一个简单的任务.h
文件,而编译.c
,例如,就像编译器其它语言做含蓄。 典型的电流C编译器不这样做的其实不是一种语言设计问题 - 这是一个实现问题; 显然没有这样的功能需求用户,所以没有编译器厂商困扰执行它。
作为一种语言的设计选择,有独立.h
文件(人类可读和可编辑的文本格式)为您提供了两全其美的:你可以开始单独编译客户端代码基于一个并不存在的模块实现,如果你想,通过写.h
手工文件; 或者你(通过荒谬的供应成为一个编译器实现;-)假设可以得到.h
从执行情况编译它的副作用自动文件。
如果C,C ++,&C,保持蓬勃发展(显然他们还在做精今天;-),并要求像你这样不手动编写头的增加,最终编译器的编写者必须提供“头生成”选项,并且“两全其美”不会留理论 - !)
Answer 3:
它有助于想想是可用的时候,说C,写计算机的能力一点。 主存储器在kilowords测量,并不见得很多人。 圆盘大,但数量不多。 Serrious存储意味着卷到卷磁带,由专人安装,由脾气暴躁的运营商,谁真的想你走开,使他们能够发挥追捕wumpus。 A 1台MIPS机器尖叫快 。 而所有这些限制,你必须分享 。 可能与得分的其他用户。
凡是减少编译的空间或时间复杂度是一个巨大的胜利。 和头一举两得。
Answer 4:
不要忘了一个头提供的文档。 通常有在任何事情,你需要知道使用该模块。 我为我的一部分不希望通过looong源代码进行扫描,以了解那里是我需要使用以及如何调用它...你会提取这些信息,无论如何,这有效地产生了 - 一个头文件。 不再与现代的IDE当然,一个问题,但也有一些旧的C代码,我真的很喜欢有手工制作的头文件,其中包括有关使用情况和有关前和后置条件注释工作。
保持源,页眉和同步附加文档仍然是蠕虫另可...
Answer 5:
检查语言处理器的二进制输出文件的整体思路会一直很难理解当C发明.h
文件。 有一个叫做系统JOVIAL是不喜欢的东西,但它是异国情调和限制更多或更少的专门为军事项目。 (我从来没有见过一个愉快的程序,我只听说这件事。)
所以,当C出来的模块化通常的设计模式是“没有任何检查”。 有可能是符号.text区段只能链接与.text区段和到。数据。数据的限制,但仅此而已。 也就是说,这一天通常编译器处理一个源文件在同一时间,然后链接器把它们放在一起没有错误检查以外丝毫的水平,如果你是幸运的,“我是一个函数符号”与“我一个数据码元”。
所以实际上具有编译器的想法理解你打电话的事情是有点新。
即使在今天,如果你犯了一个完全虚假的头,没有人发现你以最AOT编译器 。 像CLR语言和Java聪明的事情实际上做编码的类文件的东西。
所以,是的,从长远来看,我们可能不会有头文件。
Answer 6:
没有你没有在Java中头 - 但你确实有接口和I每一个严肃的Java大师建议您定义的其他项目/系统作为一个接口和一个实现中使用任何东西。
让我们来看看一个Java接口定义包含呼叫特征,类型定义和contants。
大多数C头文件包含呼叫特征,类型定义和常量。
因此,对于所有目的之实践的C / C ++头文件只是接口定义,因此应被视为一件好事。 现在我知道它可以定义在头文件中无数其他的东西,以及(MARCROs,常量等等,等等),但C的整个精彩世界的,只是部分: -
int function target () {
// Default for shoot
return FOOT;
}
Answer 7:
详细阅读本
头文件通常包含类,子例程,变量以及其他标识符向前声明。 谁希望在多于一个源文件中声明规范标识符程序员可以在一个单一的头文件,它每当需要的标题内容以外的代码可以包括放置这样的标识符。
C标准库和C ++标准库传统上声明其标准函数中的头文件。
Answer 8:
如果你想要的东西到别的给人使用你的库没有给他们实施的声明?
作为另一个答案指出的 - 当初之所以标题是使解析/用非常简单和有限的工具编译的平台上更容易。 这是一个巨大的进步有一个机器2张软盘,所以你可以有一个编译器和你对其他代码 - 做事情更容易。
Answer 9:
当您在头文件和源文件划分代码你把声明和定义。 当你在头文件中,您可以看到你有什么,如果你的魔杖看到实现细节你到源文件。