Значение макроса препроцессора в строковом литерале Objective-C - PullRequest
26 голосов
/ 30 сентября 2011

У меня есть макрос препроцессора, определенный в настройках сборки.

FOO=BAR

Это значение, которое я хочу преобразовать в строковый литерал Objective-C, который можно передать в метод.Следующий #define не работает, но он должен продемонстрировать то, чего я пытаюсь достичь:

 #define FOOLITERAL @"FOO" //want FOOLITERAL to have the value of @"BAR"

 myMethodThatTakesAnNSString(FOOLITERAL);

Я ожидаю, что я как-то упускаю очевидное, но я не могу найти правильного препроцессораполучите то, что мне нужно.

Ответы [ 4 ]

35 голосов
/ 30 сентября 2011

Используйте строковый оператор #, чтобы создать строку C из символа.Однако из-за причуды препроцессора вам нужно использовать два дополнительных слоя макросов:

#define FOO BAR
#define STRINGIZE(x) #x
#define STRINGIZE2(x) STRINGIZE(x)
#define FOOLITERAL @ STRINGIZE2(FOO)
// FOOLITERAL now expands to @"BAR" 

Причина появления дополнительных слоев заключается в том, что оператор stringizing может использоваться только для аргументов макросане на других токенах.Во-вторых, если к аргументу макроса применяется оператор строкового преобразования в теле макроса, то этот аргумент не раскрывается как другой макрос.Таким образом, чтобы обеспечить расширение FOO, мы переносим в другой макрос, так что когда расширяется STRINGIZE2, он также расширяет FOO, потому что оператор преобразования в строку не появляется в теле этого макроса.

28 голосов
/ 04 февраля 2013

Вот модифицированная версия ответа Адама Розенфилда с более четкой семантикой:

#define NSStringize_helper(x) #x
#define NSStringize(x) @NSStringize_helper(x)

Я использую его для замены кода следующим образом:

case OneEnumValue: name = @"OneEnumValue"; break;
case AnotherEnumValue: name = @"AnotherEnumValue"; break;

с этим:

#define case_for_type(type) case type: name = NSStringize(type); break

case_for_type(OneEnumValue);
case_for_type(AnotherEnumValue);
0 голосов
/ 17 августа 2017

Вам нужно определить макрос препроцессора как,

FOO=\@\"BAR\"

И использовать сторону кода, как,

[NSString stringWithFormat:@"macro: %@", FOO];
0 голосов
/ 30 сентября 2011

Какую ошибку вы видите точно?Этот тип вещи работает так, как вы ожидаете:

#define kMyString @"MyString"

[NSString stringWithFormat:@"macro: %@", kMyString];
...