为什么我们需要编写头文件?


12

在您提出尖刻的评论之前,我知道-这是一个nooby问题。这是我第一次使用基于C的语言。

我是一名本科生,正在学习有关移动开发的计算机科学课程的目标C。我知道,在学术环境中,由于您正在构建较小的项目,在较小的团队中工作等,因此不需要很多现实世界的考虑。

但是我们的教授要求-并且XCode支持-每个.m实现文件的.h头文件。对我来说,这似乎是忙碌的工作。我必须确保将每个方法签名和实例变量都复制到另一个文件中。如果更改一个文件,则必须确保它与另一个文件一致。好像只是一堆小麻烦。

但我知道,必须有一些现实世界中使用的头文件。一个很好的答案将解决这两个问题:

  1. 对于不适合实现文件的头文件有什么用?目的是什么?
  2. 为什么我们作为程序员必须手动编写头文件?看来它们很容易自动生成。

提前致谢!


XCode是否支持自动重构,以便如果您更改标头中的签名,它会自动传播到实现中(反之亦然)?或者,也许有一个支持该功能的插件?我知道手动进行是很痛苦的。
FrustratedWithFormsDesigner

当我了解到头文件时,我的第一反应是“必须有一种自动执行此操作的方法”。当我尝试寻找一种可以帮助解决该问题的工具时,我感到非常困惑,但没有找到任何明显的选择。
哈特利·布罗迪

我很惊讶这样的功能不存在。我知道Eclipse可以为Java进行这种重构,我不知道C / C ++插件是否可以进行标头/ Impl重构。我想如果XCode不存在这样的工具,那可能值得开发。;)
FrustratedWithFormsDesigner

Answers:


9
  1. 简而言之;

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

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

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

头文件中有时还包含其他信息。类型定义,常量定义等。这些定义在头文件中,而不在实现中。


但是,当有人需要使用我的代码但只能访问.h文件时,情况会如何?他们是否仍然需要.m来运行它?
哈特利·布罗迪

1
我了解从理论上讲抽象的必要性,以防您更改实现细节,但是我不确定何时会出现这种情况。
哈特利·布罗迪

10
有时,通常出于商业原因,您可能希望允许某人使用您的代码,但无权访问您的实现。在这种情况下,您将提供头文件以及已经编译的库或目标代码。
卢克·格雷厄姆

嗯,我明白了。没有考虑过该代码将已经被编译,因此可用但不可读。谢谢!
哈特利·布罗迪

3
另外,为什么我要阅读实现以了解如何使用您的代码?足以读取头文件。
Per Johansson

5

标头的主要原因是能够#include在其他文件中使用标头,因此您可以使用另一个文件中一个文件中的功能。标头包含(仅)足以使用功能的能力,而不包含功能本身,因此(我们希望)编译起来的速度要快得多。

要保持这两个最分开的结果,是因为从来没有人编写过能够很好地实现流程自动化的编辑器。他们没有这样做的理由并没有很多,甚至有一些人试图这样做-但是这样做的编辑器在市场上从来没有做得很好,而更主流的编辑器却没有采用它。


2

包含标头可让您的代码调用在其他地方编写的函数或方法,这些函数或方法可能是或可能不是您的软件项目/构建的一部分,但在构建软件时可以由“链接器”找到。

例如,当您在标准C库中调用一个函数时,您不想将该函数的所有内脏都放入您的项目中-您只是希望您的程序能够调用它。

但是需要告诉您的编译器该函数存在于某个地方,即使它看不到代码,而标头也是如此。编译器完成后,链接器将被调用,它看起来可以“链接”您的代码中那些悬空的位,例如库调用。


1

头文件主要用于声明和包含其他文件中函数的签名(即函数名,返回值和参数)。编译并将文件链接在一起时,编译器需要知道这些签名。

阅读文章以了解更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.