我主要使用Java,最近我正在尝试学习用于Mac和iOS应用程序开发的Objective-C。现在,这种语言与我习惯的,指针,消息等完全不同,但我似乎正在接受它。这不是一个编码问题,但我宁愿熟悉我正在处理的事情,而不仅仅是知道“它必须是这样的,因为它就是这样”。
为什么Objective-C语言需要头文件?它们与.m文件分开的实际目的是什么?为什么函数需要在头文件中声明而不是刚刚实现?它只是其中一个没有从旧语言中消失的东西,还是与Java的单文件类相比有真正的优势?
答案 0 :(得分:14)
由于C的向下兼容性,主要存在.h文件 - 所有C代码也是有效的Objective-C代码。 C编译器一次只能处理一个文件;每个文件都是独立编译和解析的。 C编译器“必须”在首次使用之前已经看到了某个符号的声明。所以,如果你在B.m中使用A类,那么编译器必须在某个时候看到A的声明;为了避免像#include "A.m"
这样的事情,惯例是在头文件中拆分声明并在.c,.m,.cpp ...文件中实现。
其他语言(如Java)会在编译时自动扫描B.java的同一目录中的文件,以查找其他类的声明; C编译器有点“老”,需要你#include所有必要的标题。
简而言之:主要是历史原因。
答案 1 :(得分:7)
The Wikipedia entry on header files使用与您相同的Java比较,这是一个奖励:
一些编程语言(最着名的是C,C ++和Objective-C)使用 头文件。这些文件允许程序员将某些文件分开 程序源代码的元素到可重用文件中。头文件 通常包含类,子例程的前向声明, 变量和其他标识符。希望申报的程序员 多个源文件中的标准化标识符可以放置 单个头文件中的标识符,然后其他代码可以包含 每当需要标题内容时。这是为了保持 标头中的接口与实现分开。 C 标准库和C ++标准库传统上声明它们的 头文件中的标准函数。
较新的编译语言(如Java,C#)不使用forward 声明;标识符从源自动识别 文件并直接从动态库符号中读取。这意味着
。不需要头文件
答案 2 :(得分:5)
您不必拥有头文件。你可以在同一个文件中使用你的接口和实现,但是更容易将它们分开,也使得导入类更整洁,这意味着其他类不会从.m继承它们不需要的东西(就像常量一样) )。