C中的头文件有什么意义?

ale*_*lex 20 c header-files

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

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

为什么没有其他语言使用此方法?它只是我,还是看起来有两套功能定义只会导致更多的维护和更多的错误空间?或者知道头文件只是每个C开发人员必须知道的东西?

unw*_*ind 27

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

  • 为什么它不直接扫描包含的 C 文件来检查里面的内容,这是我不明白的。 (2认同)

小智 11

编译器需要头文件中的信息才能知道哪些函数,结构等可用以及如何使用它们.

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

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

  • 似乎大多数新语言甚至已编译的语言都不再使用头文件了.那么如果我们要重新创建C,你会说现在头文件是多余的吗? (4认同)

Rem*_*o.D 9

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

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

同样适用于typedef

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

某些语言使用相同的方法.我记得TurboPascal单位并没有太大的不同.您可以use ...在开始时表示您将要求在其他地方定义的功能.我不记得是否也将其传递给Delphi.


SF.*_*SF. 7

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

可能更多。

  • @CarlG:取决于系统,通常非常不切实际。模块化,在代码级别;将两者编译成加载到一个处理器中的一个二进制文件,通常不需要操作系统和/或文件系统。仅仅为了模块化而将它们卸载到两个不同的处理器会给您带来很多与控制两者之间的硬件总线相关的麻烦,这真的不值得。(理论上它只是通过直接总线连接 2 个 I/O 端口。实际上,调试振铃、寄生负载、寄生电感和电容、EMI、时序警告、电平、时钟同步...) (4认同)
  • @CarlG:并将它们卸载到在同一处理器上运行的两个单独的可执行文件通常与编写某种操作系统有关,该操作系统将仲裁对共享资源的访问、同步计时并提供上下文切换;通常比单独执行的每个子任务更复杂的任务。将这些东西保存在单个二进制文件中确实极大地简化了工作。 (4认同)
  • 不可以。在此类系统中不可能对存储视图进行模块化吗?或者只是不切实际?我本以为深度数据库引擎最好卸载到单独的嵌入式系统,甚至(网络?)服务(如果可能的话)。 (2认同)