2014-03-06 60 views
2

我發現將.h中的常量定義爲外部屬性,然後在.m文件中指定常量,令人沮喪。似乎如此多餘。是否有任何理由不在頭文件中定義常量?.h中的靜態常量定義與.m中的外部常量的比較

典型的實現將是:

// Constants.h 
@interface Constants : NSObject 
extern NSString *const kPCFavorites; 
@end 

的實施將隨後是:

// Constants.m 
@implementation Constants 
NSString *const kPCFavorites = @"PCFavorites"; 
@end 

不過,我可以做到這一點:

// Constants.h 
static NSString *const kPCFavorites = @"PCFavorites"; 
@interface Constants : NSObject 
@end 

顯然,這最後的定義沒有按甚至不需要接口或實現,因此兩者都可以被忽略併成爲:

// Constants.h 
static NSString *const kPCFavorites = @"PCFavorites"; 

根本沒有.m文件。

這對我來說似乎更清潔。爲什麼我們不以這種方式實現常量?我已經定義了它們兩種方式,並且在XCode 5中沒有編譯或運行時錯誤。

回答

2

由於

static NSString * const kPCFavorites = @"PCFavorites"; 

聲明一個可變,不是一個常量。 C實際上沒有辦法聲明一個符號常量(除了enum,它只適用於整數)。因此,如果你使用這種方法,你的頭文件中的每個文件都會有自己的變量,稱爲kPCFavorites。從歷史上看,這意味着您的程序會因爲kPCFavourites和字符串@"PCFavourites"的所有副本而增大,儘管更現代的連接器可能會設法消除部分或全部重複(當然,我期望鏈接器只給你一個字符串本身的副本;不管它是否可以擺脫額外的指針變量,我不確定 - 但它很容易測試)。

2

靜態變量具有文件範圍。如果編譯包含帶有靜態變量的頭文件的文件,該變量將存在於編譯的文件中。如果使用相同的頭文件編譯另一個文件,則會有第二個靜態變量,依此類推。如果您包含1000個源文件的頭文件,則會獲得1000個靜態變量,全部使用相同的名稱。