Макросы отличаются от обычной функции, потому что они обрабатываются как текст , а не код .
Расширение макроса выполняется до того, как компилятор проанализирует ваш код и не зависит от языка - макрос обрабатывается одинаково независимо от целевого языка.Этот процесс обычно называется расширением макроса , которое происходит во время предварительной обработки .
__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
}