2010-05-26 7 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'한정자를 유지할 수 있지만 실제 문자열 값은 한 곳에서만 유지할 수 있기 때문이다. –

4

귀하의 질문에 대한 첫 반응은 답례로 질문이었습니다. 처음에 상수 이름을 다시 생각해 내야한다는 표시기 인 여러 이름으로 상수를 사용하고 싶습니까?

+0

+1 이것은 매우 좋은 지적이며 고려해야 할 것이 하나 있습니다. 그러나이 시점에서 동일한 값을 사용해야합니다. –

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__ ((생성자)) '함수에서 초기화를 수행 할 것입니다. –