2009-12-01 81 views
3

我見過很多.h(私有API)的蘋果。大多數變量/結構/枚舉/類都以_作爲前綴。在蘋果私人頭文件中給底層文件的原因是什麼

#import <Foundation/NSValue.h> 
#import <Foundation/NSObjCRuntime.h> 

@class NSString; 

typedef struct _NSRange { 
    NSUInteger location; 
    NSUInteger length; 
} NSRange; 

我的問題是,

什麼是背後的原因給予適當一個再次強調&的typedef呢?

回答

7

Objective-C具有全局開放的名稱空間。所有名字都是唯一的,這一點很重要。除了之前給出的原因之外,Apple保留所有下劃線名稱。這將有助於防止意外的名稱衝突。

2

它通常用作一個標誌,表示有問題的實體是私有的和/或內部的,不應該直接用在你的代碼中。我認爲,在C的舊版本中,你不能聲明一個匿名結構,所以你需要一個「填充」名稱放在那裏。

1

我相信這是爲了創建一個opaque type。這限制了類型的客戶端訪問內部細節而不使用提供的接口。然後你可以通過opaque pointer來使用該結構,並且可以聲明該類型的數組,變量等而不用擔心內部實現,從而確保如果Apple決定更改這些類型後面的代碼,則不需要重新編譯軟件。

+0

除了問題中的表單不透明以外。不透明通常通過使用typedef'd void指針並將實際結構定義保留在公共標題之外來實現。 – Benno 2009-12-02 00:07:45

+0

你可能是對的,因爲某種原因,我認爲他是在公開/私有的代碼合併後,他談論私人API。 – phoebus 2009-12-02 00:39:52

1

對於聲明結構,聲明typedef struct _name {...} name的風格可以追溯到GCC 2.0左右的日子,正如上面提到的那樣,您不能擁有一個匿名結構。

對於ivars的名稱,單引號下劃線是Apple內部編碼約定,正式說Apple保留所有以單下劃線開頭的名稱。如果蘋果以這種方式命名所有的ivars,那麼如果你不這樣做,你將不會與他們的任何名字相沖突。

不幸的是,許多示例代碼項目已經發布在Apple的開發人員網站上,而沒有通過代碼並刪除伊娃名稱上的前導下劃線。發生這種情況的原因有兩個,其中主要原因是Apple內部的開發人員習慣於以這種方式命名變量,另一個原因是審閱示例代碼項目的人員並沒有真正關心強制執行標準代碼樣式。

相關問題