Константы под другим именем - PullRequest
6 голосов
/ 26 мая 2010

Во-первых, я видел этот вопрос и понимаю, почему следующий код не работает. Это не мой вопрос.

У меня есть константа, которая объявлена ​​как;

//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) я могу предоставить одну константу под несколькими именами?

Ответы [ 3 ]

6 голосов
/ 26 мая 2010

В общем, компилятор будет складывать одинаковые строковые константы в одни и те же строки, если вы не запретите это. Даже если вы не можете инициализировать одну константу с другой, инициализация их обоих с одинаковым значением будет иметь одинаковый чистый эффект.

//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, доступный для этих исходных файлов.

4 голосов
/ 26 мая 2010

Моей первой реакцией на ваш вопрос был ответный вопрос - является ли тот факт, что вы хотите иметь константу под несколькими именами, индикатором того, что имя константы нуждается в переосмыслении в первую очередь?

2 голосов
/ 26 мая 2010

Назначьте свои строковые константы в коде:

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

Один недостаток, если он не защищен компилятором от модификации. Однако инициализация очень гибкая, и вы можете улучшить другой код. Вы также гарантируете разные адреса для своих строк, независимо от того, решит ли компилятор, что свертывание - это то, что он делает на этой неделе.

...