Макрос препроцессора до Objective-C строковый литерал
У меня есть макрос препроцессора, определенный в настройках сборки
FOO=BAR
Это значение Я хочу массировать в литерал строки Objective-C, который может быть передан методу. Следующий #define не работает, но он должен продемонстрировать, чего я пытаюсь достичь:
#define FOOLITERAL @"FOO" //want FOOLITERAL to have the value of @"BAR"
myMethodThatTakesAnNSString(FOOLITERAL);
Я ожидаю, что как-то я просто упустил очевидное, но я не могу найти подходящего vprooo препроцессора, чтобы получить то, что мне нужно.
Ответы
Ответ 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];