Так как же препроцессор обрабатывает параметры в макросах?
По существу Макрос замены строка замены, но язык знают.
Язык, обозначающий, состоит в том, что текст замены макроса и параметров макроса должен быть целыми маркерами в (Objective-) C (++); вы не можете включить, скажем, открытую двойную кавычку без закрывающей. Однако это осознание останавливается на уровне токенов, вы можете определять макросы и передавать макросы, которые являются неполными фрагментами кода или даже недопустимыми фрагментами кода, если только отдельные токены действительны.
Как часть понимания языка, комментарии и дополнительные пробелы также удаляются во время предварительной обработки.
строка замена часть заключается в том, что макрос «вызов» заменяется просто текстом (отдельными токенами), которые составляют его определение, и каждое использование параметра в определении заменяется текстом параметр в вызове. Это все происходит до компилятор анализирует синтаксис кода.
Таким образом, в вашем примере:
#define FBOX(x) [NSNumber numberWithFloat:x]
то "вызов":
... FBOX(1.0f) ...
заменяется:
... [NSNumber numberWithFloat:1.0f] ...
перед компилятор анализирует синтаксис кода.
Чтобы увидеть, что макрос быть tokenised, мы можем переопределить макрос как:
#define FBOX(x) [NSNumber numberWithFloat:x.0f]
, а затем попробовать:
... FBOX(1) ...
Макрос замещается успешно, но компилятор выдает при анализе синтаксиса, потому что текст результата выглядит следующим образом:
... [Номер NSNumberWithFloat: 1 .0f] ...
, где 1
& .0f
два тотала и ни одного числа с плавающей запятой. Поэтому компилятор ожидает ]
после 1
и сообщит об ошибке.
В Xcode, если вы выберете продукт: выполнить действие: код предварительной обработки. Xcode покажет вам результат вашего файла после предварительной обработки.
Что за путаница? То, что вы говорите, правильно. 'FBOX (1.0f)' переводится в '[NSNumber numberWithFloat: 1.0f]' – rmaddy
BTW - такой макрос в наши дни устарел. Используйте новый буквенный синтаксис бокса. Пример: '[someArray addObject: @ 1.0];' или '[someArray addObject: @ (somePrimitiveNumberTypeVariable)];'. – rmaddy
@rmaddy NSNumber может содержать 'BOOL' тоже. Работает ли '@ YES' и' @ NO'? Или я должен использовать '@ 1' и' @ 0'? – nhgrif