2015-08-25 3 views
2

Рассмотрим следующий вызов:Ошибка в анализе функций, подобных функциям Clang с вызовом метода Variative A Objective C?

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

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

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

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

Wrap в скобках:

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

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

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

+0

Файл с сообщением об ошибке с Apple. – rmaddy

+0

@rmaddy Я сделал, # 22418824 –

+1

BTW - не должен быть первым параметром для 'NSLocalizedString' быть строковым литералом? Помните, что вы используете инструмент командной строки 'gestrings' для создания локализованного файла строк. Это означает, что он просто анализирует файлы исходного кода. Нет смысла определять ваши ключи на основе значения времени выполнения. – rmaddy

ответ

2

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

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

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

HTH

+0

Но это файл '.m', который предварительно обрабатывается. Должен ли этот препроцессор не расширяться, чтобы быть знакомым с синтаксическими скобками Objective C так же, как он знаком с синтаксическими скобками C? –

+1

@LeoNatan - Ну, это другой вопрос! ;-) Должно ли это? Не могли бы? Помните, что макрораспределение определяется как синтаксический анализ * перед *, поэтому, хотя это может быть сделано не так просто, как может показаться. Вам также необходимо убедиться, что такое изменение не нарушит использование макросов C, помните, что Objective-C является надмножеством C, и все стандартные C должны компилироваться без ошибок. – CRD

+2

BTW Лучшим решением для Apple было бы определение 'NSLocalizedString' как встроенной функции, это позволяет избежать проблемы, с которой вы сталкиваетесь, и дает более« нормальное »поведение (каждый аргумент оценивается только один раз и т. Д.). – CRD