Ошибка в синтаксическом разборе макроса, подобного функции Clang, при вызове метода переменных Objective C?

Рассмотрим следующий вызов:

NSString* localized = NSLocalizedString([NSString stringWithFormat:@"Hello %@", @"World"], @"");

Что с этим не так? Я не вижу ничего по сути неправильного, но компилятор / препроцессор жалуется, что ему передано слишком много параметров. С другой стороны, следующие два компилируются:

Явная переменная:

NSString* string = [NSString stringWithFormat:@"Hello %@", @"World"];
NSString* localized = NSLocalizedString(string, @"");

Завернуть в скобки:

NSString* localized = NSLocalizedString(([NSString stringWithFormat:@"Hello %@", @"World"]), @"");

Похоже, препроцессор / компилятор неправильно анализирует , персонаж.

Я получаю это в Xcode 7 beta 6, так что это может быть новой ошибкой в ​​наборе инструментов Clang.

1 ответ

Это не ошибка, это то, как работает препроцессор Си. Из стандарта С:

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

Таким образом, запятые ограничивают аргументы макроса, если они не находятся внутри совпадающих внутренних скобок - это ваш вариант "заключить в скобки". Си не говорит о соответствующих скобках, [ & ]только скобки, ( & )Итак, ваш первый пример имеет три макро-аргумента: [NSString stringWithFormat:@"Hello %@", @"World"] а также @"", Предварительная обработка выполняется перед синтаксическим анализом, поэтому то, что первые два аргумента не имеют синтаксического смысла в (Objective-)C, не имеет значения.

НТН

Другие вопросы по тегам