Как работают макросы в Objective-C? - PullRequest
0 голосов
/ 15 апреля 2011

Я хотел бы знать, как макросы работают в Objective-C, как компилятор интерпретирует их, что отличает их от обычной функции.Кроме того, как они могут получить доступ к __LINE__, __FILE__, _cmd и наиболее любопытным self (не передавая их им) в текущем контексте?

Ответы [ 4 ]

5 голосов
/ 15 апреля 2011

Они работают так же, как и в чистом C .

Макросы обрабатываются препроцессором компилятора, в это время компилятор все еще имеет полный доступный исходный код (итем самым имя __FUNCTION__ или текущее __LINE__).Вы можете думать о макросах как о некоторой продвинутой магии «замены текста».

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

Для получения дополнительной информации о макросах и препроцессоре C смотрите здесь: http://en.wikipedia.org/wiki/C_preprocessor

2 голосов
/ 15 апреля 2011

Макросы отличаются от обычной функции, потому что они обрабатываются как текст , а не код .

Расширение макроса выполняется до того, как компилятор проанализирует ваш код и не зависит от языка - макрос обрабатывается одинаково независимо от целевого языка.Этот процесс обычно называется расширением макроса , которое происходит во время предварительной обработки .

__LINE__ и __FILE__ - это макросы, определенные компилятором, поэтому они простозаменено текстом.Макрос может «обращаться» к _cmd и self, если и только если эти переменные существуют в контексте раскрытого макроса - макрос на самом деле не обращается к этим переменным, макрос расширен и полученный код обращается к переменным.

Вы можете увидеть эффект макропроцессора, выбрав Preprocess в XCode's Build menu.

Вот (странный) пример для демонстрации:

#define BEGIN {
#define END }

int main(int argv, char *argv[])
BEGIN
    ... // body of main
END

, который расширяется до более обычного:

int main(int argv, char *argv[])
{
    ... // body of main
}
0 голосов
/ 15 апреля 2011

__LINE__ и __FUNCTION__ предоставляются компилятором и расширяются во время предварительной обработки.self и _cmd - это параметры, неявно передаваемые каждому методу ObjC, и являются частью языка Objective-C.Они не макросы, просто невидимые параметры.

0 голосов
/ 15 апреля 2011

Они указаны в стандарте языка Си, и их поддержка встроена в компилятор.См. http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html для более длинного списка доступных стандартных макросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...