为什么Objective-C使用头文件而不是像Java这样的单文件类?

为什么Objective-C使用头文件而不是像Java这样的单文件类?,java,objective-c,header-files,Java,Objective C,Header Files,我主要从事Java工作,最近正在尝试学习Objective-C用于Mac和iOS应用程序开发。现在,这种语言和我习惯的语言,指针,消息等有很大的不同,但我似乎很好地学会了。这并不是一个编码问题,但我更愿意正确地熟悉我正在处理的内容,而不是仅仅知道“它必须是那样的,因为它就是这样的” 为什么Objective-C语言需要头文件?它们与.m文件分离的实际目的是什么?为什么函数需要在头中声明而不是仅仅实现?它只是那些没有从旧语言中消失的东西之一,还是与Java的单文件类相比有真正的优势?您不必有头文件

我主要从事Java工作,最近正在尝试学习Objective-C用于Mac和iOS应用程序开发。现在,这种语言和我习惯的语言,指针,消息等有很大的不同,但我似乎很好地学会了。这并不是一个编码问题,但我更愿意正确地熟悉我正在处理的内容,而不是仅仅知道“它必须是那样的,因为它就是这样的”


为什么Objective-C语言需要头文件?它们与.m文件分离的实际目的是什么?为什么函数需要在头中声明而不是仅仅实现?它只是那些没有从旧语言中消失的东西之一,还是与Java的单文件类相比有真正的优势?

您不必有头文件。您可以将接口和实现放在同一个文件中,但这样可以更容易地将它们分开,还可以使导入类更整洁,这意味着其他类不会从.m继承它们不需要的东西(如常量)。

使用与Java相同的比较,这是一个额外的好处:

一些编程语言(最明显的是C、C++和Objtovi-C)使用 头文件。这些文件允许程序员分离某些 将程序源代码的元素转换为可重用文件。头文件 通常包含类、子例程、, 变量和其他标识符。希望声明 多个源文件中的标准化标识符可以放置这样的文件 单个头文件中的标识符,其他代码可以包括这些标识符 每当需要标题内容时。这是为了保持 标头中与实现分离的接口。C 标准库和C++标准库传统上声明它们 头文件中的标准函数

较新的编译语言(如Java、C#)不使用forward 声明;标识符是从源代码自动识别的 文件,并直接从动态库符号中读取。这意味着 不需要头文件


h文件的存在主要是因为C的向下兼容性—所有C代码也是有效的Objective-C代码。C编译器一次只能处理一个文件;每个文件都是独立编译和解析的。C编译器“必须”在首次使用某个符号之前已经看到了该符号的声明。因此,如果您在B.m中使用类A,编译器一定在某个时候看到了A的声明;为了避免像
#include“A.m”
这样的操作,惯例是在头文件中拆分声明,在.c、.m、.cpp中拆分实现。。。档案

Java等其他语言在编译时会自动扫描B.Java同一目录下的文件,查找其他类的声明;C编译器有点“旧”,需要包含所有必要的头

简而言之:主要是历史原因。

FWIW,一些更古老的编译语言,如Pascal和Delphi,也不需要头。它们使用单元,其中接口和实现部分位于一个文件中,声明等以编译器友好的二进制格式提供。