Подтвердить что ты не робот

Макрос препроцессора до Objective-C строковый литерал

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

FOO=BAR

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

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

 myMethodThatTakesAnNSString(FOOLITERAL);

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

#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);

Ответ 3

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

FOO=\@\"BAR\"

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

[NSString stringWithFormat:@"macro: %@", FOO];

Ответ 4

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

#define kMyString @"MyString"

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