0

除了允许一个文件使用另一个文件的属性之外,幕后究竟发生了什么?它只是在以后需要其内容时提供访问该文件的位置,还是将实现的数据加载到内存中?

4

1 回答 1

3

简而言之;

头文件定义了模块的 API。这是一份合同,列出了第三方可以调用的方法。该模块可以被视为第三方的黑匣子。

该实现实现了该模块。它是黑匣子的内部。作为模块的开发人员,您必须编写此代码,但作为第三方模块的用户,您不需要了解有关实现的任何信息。标题应包含您需要的所有信息。

头文件的某些部分可以自动生成 - 方法声明。这将需要您对实现进行注释,因为实现中可能存在私有方法,它们不构成 API 的一部分并且不属于标头。

头文件中有时包含其他信息;类型定义,常量定义等。这些属于头文件,而不是实现。头文件的主要原因是能够#include 它在其他文件中,因此您可以在另一个文件的一个文件中使用函数。标头包含(仅)足以能够使用函数,而不是函数本身,因此(我们希望)编译它的速度要快得多。

将这两个分开维护是因为没有人编写过一个可以很好地自动化该过程的编辑器。他们不能这样做的原因并不多,甚至有一些人甚至尝试过——但这样做的编辑在市场上从来没有做得很好,更主流的编辑也没有采用它。

好吧,我会尝试:仅在预处理阶段才需要头文件。一旦预处理器完成了它们,编译器甚至不会看到它们。显然,目标系统也不需要它们来执行(同样不需要 .c 文件)。

相反,库是在链接阶段执行的。如果程序是动态链接的,并且目标环境没有必要的库,在正确的位置,正确的版本,它将无法运行。在 C 中,不需要这样的东西,因为一旦你编译它,你就会得到本机代码。当你#include它时,头文件被复制粘贴。它与您从 java 获得的字节码非常不同。不需要解释器(如 JVM):您只需将二进制文件提供给 CPU,它就会完成它的工作。

于 2013-04-27T22:50:42.913 回答