2010-12-19 58 views
10

我知道你可以通過使用「extern」在Objective-C中定義一個全局變量,但是我剛纔意識到我已經在我的第一個方法之前,我的.m文件的頂部也意外全球(這是導致一些問題)。我將它們移動到我的頭文件的@interface部分,我認爲它正確地聲明它們只存在於類中,這已經解決了我的一些問題,但我仍然有點困惑。Objective-C中的全局變量 - .m文件聲明中extern和top的區別

將變量聲明爲extern並將其放在.m文件的頂部有什麼區別?或者做那些導致同樣的事情?

回答

25

的extern是明確說明的方式,爲便於閱讀和編譯時強制執行,那你只是聲明這個變量在這裏,實際上希望它是定義別處。如果你也想嘗試定義extern變量,編譯器會告訴你你的方法錯誤。這對於全局變量來說是很有用的,可以防止名稱衝突和多重定義,這兩者都會導致鏈接器錯誤。但是,extern關鍵字本身並不能使全局變量。

什麼使全局變量是它的聲明在文件中的位置。如果要在類的頭文件中的@interface外部聲明一個變量,則應該聲明一個變量,該變量在您的類的所有實例以及#import標頭的任何實例中共享並可見。如果你想(並且顯然是)在你的類的.m文件的@implementation之外聲明瞭一個變量,你也應該聲明一個在你的類的所有實例之間共享的變量,但是對於任何#輸入你的標題。

因此,使用變量聲明的位置來確定範圍。您將只有定義這些全局變量在一個地方。對於您所有其他地方,您使用extern前綴該聲明以使代碼可讀,您的意圖清晰,並確保您不再嘗試並再次定義它。

+11

短版本:extern表示它存在於某處,但不在此處。沒有它在@interface或@implementation裏面使它成爲一個全局的。 – ughoavgfhw 2010-12-19 06:50:07

+0

很好的解釋,謝謝。 – 2010-12-19 06:59:01

+0

感謝您的幫助! – Jackson 2010-12-19 07:30:39