我不太理解为什么需要一个头部,这似乎违反了DRY原则!头部中的所有信息(可以)都包含在实现中。
我不太理解为什么需要一个头部,这似乎违反了DRY原则!头部中的所有信息(可以)都包含在实现中。
它简化了编译过程。当您想要独立编译单元时,需要一些描述将链接到的部分的东西,而不必导入所有其他文件的全部内容。
它还允许隐藏代码。可以分发头文件以允许他人使用功能,而无需分发实现。
最后,它可以鼓励将接口与实现分离。
它们不是解决这些问题的唯一方法,但在30年前它们是一个好方法。今天我们可能不会为语言使用头文件,但它们并不是在2009年发明的。
当c语言开发时,可用的计算机能力应该考虑一下。主内存以千字为单位进行测量,且数量并不多。硬盘更大一些,但也不是很大。真正的存储意味着需要使用卷轴式磁带,手动安装,由不爽的操作员操作,他们真的希望你走开,这样他们就可以玩“Hunt the Wumpus”游戏了。1 MIP的计算机速度是非常快的。在所有这些限制下,你必须与其他几十个用户共同使用它。
任何可以减少编译空间或时间复杂度的东西都是一个巨大的胜利。头文件就能做到。
.h
文件时,检查语言处理器的二进制输出文件的整个想法可能很难理解。有一个名为JOVIAL的系统做了类似的事情,但它是奇特的,几乎只限于军事项目。 (我从未见过JOVIAL程序,只是听说过。)因此,当C语言问世时,模块化的通常设计模式是“没有任何检查”。可能会有一个限制,即.text符号只能链接到.text,.data只能链接到.data,但仅此而已。也就是说,当时的编译器通常一次处理一个源文件,然后链接器将它们组合在一起,除了如果你很幸运,“我是函数符号”与“我是数据符号”之外,没有任何错误检查的最小级别。因此,让编译器真正理解您正在调用的内容的想法有些新颖。即使今天,如果您制作一个完全虚假的头文件,在大多数AOT编译器中都不会被发现。聪明的东西,如CLR语言和Java,实际上会在类文件中编码一些东西。在Java中,你没有头文件,但是你有接口。每个认真的Java专家都建议你将任何被其他项目/系统使用的东西定义为接口和实现。
让我们看一个Java接口定义包含调用签名、类型定义和常量。
大多数C头文件包含调用签名、类型定义和常量。
因此,对于所有实际目的而言,C/C++头文件只是接口定义,因此应该被视为一件好事。现在我知道在头文件中还可以定义其他无数的东西(宏、常量等等),但这只是C世界的一部分:-)
int function target () {
// Default for shoot
return FOOT;
}
详细阅读请点击this
头文件通常包含类、子程序、变量和其他标识符的前向声明。希望在多个源文件中声明标准标识符的程序员可以将这些标识符放在单个头文件中,其他代码可以在需要头文件内容时包含它们。
C标准库和C++标准库传统上在头文件中声明它们的标准函数。
如果你想让别人使用你的库的声明而不给他们实现,该怎么办呢?
正如另一个答案所指出的那样,头文件最初的原因是为了使在具有非常简单和有限工具的平台上进行解析/编译更容易。拥有两个软盘的机器可以让你在一个软盘上拥有编译器,而在另一个软盘上拥有代码,这使得事情变得更加容易。
当你将代码分为头文件和源文件时,你会分离声明和定义。当你查看头文件时,你可以看到你拥有什么,如果你想要查看实现细节,你需要去源文件。