在我的iOS/Objective C項目中,我經常有一個constants.h文件和我的API密鑰等。直到今天,我已經宣佈我的常量,static
const
像這樣:static const與extern const不同嗎?
static NSString * const kAPIKey = @"wembvkejrvb43789gvbiu2bvfake";
這工作得很好,但不幸的缺點,我可以只創造原語和文字NSString的常量,本質上。其他對象,如UIColor對象,不能存儲在這個常量中,因爲它們不能用靜態文字語法(我的理解,需要引用)初始化。
閱讀一些C++的文檔後,我明白了一些東西:
- 的
static
是不必要的,因爲const
隱含靜態的。 - 調用
NSString * const x
實際上是在x中聲明一個常量和不可變的值。我無法改變價值,但可能能夠改變x點。 - 此常量有內部鏈接,意味着該值立即定義(可在編譯時推斷)。
這些結論是否正確?
extern const
與extern const
有什麼區別?我假設他們是外部鏈接的(因此extern關鍵字)。它們是在運行時定義的嗎?我可以創建某種動態extern const
可以使用類方法返回的值設置嗎?
例如,我想創建一個全局範圍的常量,其中包含一個UIColor值。我想用[UIColor colorWithRed:green:blue:alpha:]
類的方法構造這個顏色值。這顯然不適用於我一直使用的內部鏈接常量(我假設是因爲它發生在編譯時) - 但它可能使用外部常量,可能在+initialize
方法中設置?
任何關於此行爲細節的闡述都將非常有幫助。
如果'static'限制範圍,並且'extern'表示該變量是在其他地方定義的,那麼我甚至不需要extern'作爲全局常量?我可以在頭文件中使用NSString * const SomeString = @「Some String」,並從任何導入該頭文件的文件中訪問SomeString?換句話說,全局常量是否需要'extern'? – cdstamper 2014-12-11 00:51:49
如果你這樣做(在頭文件中定義'SomeString'),如果頭文件包含在多個實現文件中,你會得到關於多個定義的錯誤。 'extern'給你一種聲明存在其他地方定義的變量的方法,這樣聲明就可以被導入到許多文件中,但'SomeString'只被定義*一次。 – Caleb 2014-12-11 00:56:12
非常有趣。所以我的'static const'模式只工作,因爲我已經在一個空的頭文件中聲明瞭它們在任何類之外,然後我將它們包含在其他地方。必須在編譯時使用接受的文字來定義'extern'常量,或者有什麼方法可以創建一個'動態'常量(可能在+初始化中定義)。 – cdstamper 2014-12-11 01:11:11