39

可能的重复项:
[C] 每个源文件的标题。
在 C++ 中为什么有头文件和 cpp 文件?
C++ - .h 文件应该包含什么?

C 中存在头文件的唯一原因是开发人员可以快速查看可用的函数以及它们可以采用的参数吗?还是与编译器有关?

为什么没有其他语言使用这种方法?是我一个人,还是看起来有 2 组函数定义只会导致更多的维护和更多的错误空间?还是知道头文件只是每个 C 开发人员都必须知道的事情?

4

4 回答 4

37

需要头文件来声明可用的函数和变量。您可能根本无法访问定义(= .c 文件);C 支持在库中仅二进制分发代码。

于 2010-02-02T14:21:41.603 回答
22

编译器需要头文件中的信息来了解哪些函数、结构等可用以及如何使用它们。

所有语言都需要这种信息,尽管它们以不同的方式检索信息。例如,Java 编译器通过扫描类文件或 Java 源代码来检索信息来实现这一点。

Java 方式的缺点是编译器可能需要在其内存中保存更多信息才能执行此操作。这在今天没什么大不了的,但是在 70 年代,当 C 语言被创建时,根本不可能在内存中保留这么多信息。

于 2010-02-02T14:26:43.523 回答
16

头文件存在的主要原因是在多个源文件之间共享声明。

假设您float *f(int a, int b)在文件中定义了函数并在and中a.c重用。为了允许编译器正确检查参数和返回值,您可以将函数原型放在头文件中并将其包含在源文件中,或者在每个源文件中重复原型。b.cd.c.c

typedef等也一样。

虽然理论上您可以在每个源文件中重复相同的声明,但正确管理它将成为一场真正的噩梦。

某些语言使用相同的方法。我记得 TurboPascal 单位并没有太大的不同。您会use ...在开头发出信号,表明您将需要在其他地方定义的函数。我不记得是否也将其传递给了 Delphi。

于 2010-02-02T14:25:05.863 回答
7
  1. 了解图书馆中可供您使用的内容。
  2. 将程序拆分为编译器的小块。同时编译一兆字节的 C 文件将占用比大多数现代硬件所能提供的更多的资源。
  3. 减少编译器负载。为什么要在屏幕显示程序中知道深度数据库引擎?让它只学习它现在需要的功能。
  4. 分离私人和公共数据。这种用法并不常见,但您可以在 C 中实现 C++ 使用私有字段的用途:每个 .c 文件包括两个 .h 文件,一个带有私有内容的声明,另一个带有其他文件可能需要的任何内容。命名空间冲突的可能性较小,由于密封而更安全。
  5. 备用配置。Makefile 决定使用哪个头文件,并且给定两个不同的头文件,相同的代码可以服务于两个不同的平台。

可能更多。

于 2010-02-02T14:33:12.420 回答