2010-05-26 69 views
6

首先,我已經看到this question並理解爲什麼下面的代碼不起作用。這不是我的問題。通過另一個名稱的常量

我有一個常數,它被聲明爲;

//Constants.h 
extern NSString * const MyConstant; 

//Constants.m 
NSString * const MyConstant = @"MyConstant"; 

然而,在某些情況下,它更有效進行這種無休止有一個更描述性的名稱,如MyReallySpecificConstant。我希望這樣做:

//SpecificConstants.h 
extern NSString * const MyReallySpecificConstant; 

//SpecificConstants.m 
#import "Constants.h" 
NSString * const MyReallySpecificConstant = MyConstant; 

顯然我不能這樣做(這是在上面的鏈接問題中解釋)。

我的問題是:

怎麼回事(除了像#define MyReallySpecificConstant MyConstant)我可以提供在多個名稱單一不變?

回答

6

通常,編譯器會將相同的字符串常量摺疊到相同的字符串中,除非您告訴它不要。即使你不能用另一個初始化一個常量,用相同的值初始化它們也會產生相同的淨效果。

//Constants.h 
extern NSString * const MyConstant; 
extern NSString * const MyOtherConstant; 

//Constants.m 
#define MyConstantValue "MyConstant" 
NSString * const MyConstant = @MyConstantValue; 
NSString * const MyOtherConstant = @MyConstantValue; 

您將#define隱藏在一個源文件中而不是標頭中。您只需在一個地方更改值。你有一個常量的兩個名字。當然,在你用多個文件定義常量的情況下,你必須讓那些源文件可以訪問#define。

+0

+1我喜歡這個選項,因爲它允許我保留我的'const'修飾符,但仍然只有實際的字符串值在一個地方。 – 2010-05-26 04:54:39

4

我對你的問題的第一反應是一個回報問題 - 你是否希望在多個名稱下有一個常量,這個常數名稱首先需要重新考慮的事實?

+0

+1這是一個很好的觀點,我應該考慮一個。但是,在這一點上,我需要使用相同的值。 – 2010-05-26 04:53:25

2

在分配代碼的字符串常量:

//Constants.h 
extern NSString * MyConstant; 
extern NSString * MyOtherConstant; 
void setUpConstants(); 

//Constants.m 
NSString * MyConstant; 
NSString * MyOtherConstant; 
NSString * const ValueOfString = @"A Value"; 
void setUpConstants() 
{ 
    MyConstant = ValueOfString; 
    MyOtherConstant = ValueOfString; 
} 

一個缺點,如果他們不被修改對編譯器的保護。然而,初始化非常靈活,您可能可以改進其他代碼。你也可以保證你的字符串有不同的地址,不管編譯器是否決定這周的摺疊。

+0

+1我想如果我走這條路線,我可能會在'__attribute__((構造函數))'函數中進行初始化,以便在加載代碼時自動發生。 – 2010-05-26 05:10:42