標籤:
今天在項目中用到一些常用的字串,於是我直接建立了一個constant.h檔案用#define來定義。
後來在網上看各位大神都建議用字串常量來定義,於是我把所有的宏定義都換成了NSString * const,比如NSString * const LTNNextStep = @"下一步";
該.h檔案主要在兩個類中使用,但是#import該檔案後發現了一個連結問題:
ld:11 duplicate symbols for architecture x86_64clang: error: linker command failed with exit code 1 (use -v to see invocation)
原來,書中說在標準C中const定義的變數是外串連的,即如果一個編譯單元中定義了一個全域const常量,則其在其他編譯單元中是可見的,如果其他編譯單元也定義了同名const常量就會產生重複定義錯誤。這一點與C++不同,C++中const定義的變數是內串連的,即每個編譯單元定義的全域const常量是自己專屬的。
Objective-C是標準C的另一種擴充,那麼我犯的錯誤也就很明顯了——當多個編譯單元都引用那個constant.h檔案時出現了重複定義錯。
但是將
NSString * const,比如NSString * const LTNNextStep = @"下一步";
修改為
static NSString * const,比如NSString * const LTNNextStep = @"下一步";
就順利編譯通過了。這裡的static是用來把定義的const常量標記為對外不可見的。
目前我的基礎知識還不紮實,因此也說不出個所以然。以後會再仔細研究研究。
用通用的方法,直接建立一個.h和一個.m檔案,在.h檔案中:
@interface Constant : NSObjectextern NSString * const LJNextStep;@end
這裡使用到extern c關鍵字,表示這個變數已經聲明,只是引用。const關鍵字表示變數是常量,不可修改。
在.m檔案中:
@implementation ConstantNSString * const LJNextStep = @"下一步";@end
Objective-C中常量重複定義的解決方案