2014-01-19 3 views
0

У меня есть макрос так:Как препроцессоры обрабатывают скобки в макросах?

#define FBOX(x) [NSNumber numberWithFloat:x] 

И я слышал, что макросы обрабатываются с помощью препроцессора таким образом, когда источник будет просто заменить на макро текст, но это не имеет смысла для меня, когда круглые скобки бросаются в микс, потому что я никогда не говорю FBOX(x). Я говорю что-то вроде FBOX(1.0f). Итак, как точно обрабатывает параметры препроцессора в макросах?

+1

Что за путаница? То, что вы говорите, правильно. 'FBOX (1.0f)' переводится в '[NSNumber numberWithFloat: 1.0f]' – rmaddy

+1

BTW - такой макрос в наши дни устарел. Используйте новый буквенный синтаксис бокса. Пример: '[someArray addObject: @ 1.0];' или '[someArray addObject: @ (somePrimitiveNumberTypeVariable)];'. – rmaddy

+0

@rmaddy NSNumber может содержать 'BOOL' тоже. Работает ли '@ YES' и' @ NO'? Или я должен использовать '@ 1' и' @ 0'? – nhgrif

ответ

0

Он просто заменяет x с 1.0f, так:

NSNumber *n = FBOX(1.0f); 

становится:

NSNumber *n = [NSNumber numberWithFloat:1.0f]; 

это затем представлен компилятором.

0

Дан:

#define FBOX(x) [NSNumber numberWithFloat:x] 

Использование FBOX(1.0f) будет заменен:

[NSNumber numberWithFloat:1.0f] 

В некотором смысле, это похоже на написание методы ...

- (void)foo:(NSObject*)bar { 
    // do stuff with bar 
} 

Вы не обязательно проходите g переменную с именем bar в метод. Вы просто передаете переменную. Тело метода затем использует переменную для того, что делает этот метод, просто, когда вы его пишете, вы ссылаетесь на него как bar, потому что у вас должно быть какое-то имя для него.

2

Так как же препроцессор обрабатывает параметры в макросах?

По существу Макрос замены строка замены, но язык знают.

Язык, обозначающий, состоит в том, что текст замены макроса и параметров макроса должен быть целыми маркерами в (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 покажет вам результат вашего файла после предварительной обработки.

Смежные вопросы