2010-05-26 15 views
6

İlk kapalı, this question'u gördüm ve aşağıdaki kodun neden çalışmadığını anladım. Bu benim sorum değil.Başka bir ad tarafından sabitler

Benim gibi bir sabrım var;

//Constants.h 
extern NSString * const MyConstant; 

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

Ancak, bazı bağlamlarda, bu sabit MyReallySpecificConstant gibi çok daha açıklayıcı ada sahip olması daha yararlıdır. Yapmam umuyordum:
//SpecificConstants.h 
extern NSString * const MyReallySpecificConstant; 

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

Açıkçası ben bunu yapamaz (yukarıda bağlantısı söz konusu açıklanmıştır olan).

Sorum şu:

başka nasıl (#define MyReallySpecificConstant MyConstant gibi bir şey dışında) Birden isimler altında tek sabiti sağlayabilir?

cevap

6

Genelde, derleyici, bunu söylemediğiniz sürece, aynı dize aynı özdeş sabitleri katlar. Bir sabitin diğeriyle başlatılamamasına rağmen, her ikisini de aynı değerle başlatmanın aynı net etkisi olacaktır.

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

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

tek bir kaynak dosyada yerine başlığında #define gizlemek. Değeri sadece bir yerde değiştirmeniz gerekir. Bir sabit için iki ismin var. Elbette, birden fazla dosyada tanımlanmış sabitler içeren senaryonuzda, #define'in bu kaynak dosyaları için erişilebilir olması gerekir.

+0

+1 Bu seçeneği beğeniyorum, çünkü 'const' değiştiricemi korumamı sağlıyor, ancak yine de yalnızca gerçek dize değerini tek bir yerde tutuyor. –

4

Soruya verdiğim ilk tepkiler, karşılığında bir soruydu - Birden çok ad altında bir sabitiniz olmasını istediğiniz bir şey mi, sabit ihtiyaçların adının ilk etapta yeniden düşünülmesinin bir göstergesi mi?

+0

+1 bu çok iyi bir nokta ve muhtemelen dikkate almalıyım. Ancak, bu noktada aynı değerleri kullanmam gerekiyor. –

2

kodunda dize sabitleri ata:

//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; 
} 

Bir olumsuz onlar modifikasyonu karşı derleyici tarafından korunmadığı anlamına eğer. Ancak başlatma çok esnektir ve belki başka kodları geliştirebilirsiniz. Derleyicinin bu haftaki katlamanın ne olduğuna karar verip vermemesi de sizin dizeleriniz için farklı adresler garanti etmektesiniz.

+0

+1 Bu rotaya gidersem, muhtemelen bir __attribute__ ((constructor)) 'işlevinde başlatma işlemini yapabilirim, böylece kod yüklendiğinde otomatik olarak gerçekleşir. –

İlgili konular