2011-08-10 50 views
14

我主要在Java中工作,最近正在嘗試爲Mac和iOS應用程序開發學習Objective-C。現在,這種語言與我以前使用的語言,指針,消息等完全不同,但我似乎正在選擇它。這不是一個編碼問題,但我寧願熟悉我正在處理的內容,而不是僅僅知道「因爲事情就是這樣」。爲什麼Objective-C使用頭文件而不是像Java那樣的單文件類?

爲什麼Objective-C語言需要頭文件?他們與.m文件分開的實際目的是什麼?爲什麼函數需要在頭文件中聲明而不是僅僅實現?它只是那些沒有從舊語言中消失的東西之一,或者與Java的單一類文件相比,它有真正的優勢嗎?

回答

14

主要是.h文件存在,因爲C向下兼容 - 所有C代碼也是有效的Objective-C代碼。一個C編譯器一次處理一個文件;每個文件都是獨立編譯和解析的。 C編譯器「必須」在第一次使用之前已經看到某個符號的聲明。因此,如果您在B.m中使用A類,那麼編譯器在某個時刻必須看到A的聲明;爲了避免像#include "A.m"這樣的事情,約定是將頭文件中的聲明和.c,.m,.cpp ...文件中的實現分開。

其他語言(如Java)在編譯時會自動掃描B.java的同一目錄中的文件以查找其他類的聲明; C編譯器有點「老」,需要你#包括所有必要的頭文件。

總之:主要是歷史原因。

5

您不必擁有頭文件。你可以將你的接口和實現放在同一個文件中,但是更容易將它們分開,也可以使導入類更加整潔,並且這意味着其他類不會從.m繼承一些他們不需要的東西(比如常量)。

7

The Wikipedia entry on header files使用與Java,你做同樣的比較,這是一個意外收穫:

一些編程語言(最明顯的是C,C++和Objective-C)使用 頭文件。這些文件允許程序員將程序源代碼的某些 元素分離爲可重用的文件。頭文件 通常包含類,子例程, 變量和其他標識符的前向聲明。希望在多個源文件中聲明 標準化標識符的程序員可以將這樣的標識符置於單個頭文件中,無論何時需要頭文件內容,其他代碼都可以包含 。這是爲了保持頭部中的 接口與實現不同。標準庫和C++標準庫傳統上在頭文件中聲明它們的標準函數 。

較新的編譯語言(如Java,C#)不使用正向 聲明;標識符會自動從源文件 中識別出來,並直接從動態庫符號中讀取。這意味着 不需要頭文件。

+1

FWIW,像Pascal和Delphi這樣的一些*更老的編譯語言不需要頭文件。他們使用單元,其中接口和實現部分在一個文件中,並且聲明等以編譯器友好的二進制格式提供。 –

相關問題