#objective-c #syntax #c-preprocessor
#objective-c #синтаксис #c-препроцессор
Вопрос:
Меня немного смущает «pound if» или #if
синтаксис, который я вижу, когда смотрю на некоторые классы.
Например:
#if someConstant == someNumber
do something
#elif
etc
против:
if (someConstant == someNumber)
do something
else if {
do more stuff
}
в чем разница и зачем использовать #if
?
Ответ №1:
#if
etc — это директивы препроцессора. Это означает, что они обрабатываются перед компиляцией, а не во время выполнения. Это может быть полезно, например, при определении поведения отладки, которое компилируется только при сборке для debug
, а не release
:
#if DEBUG
#define ISRelease(x) [x release]
#else
#define ISRelease(x) [x release], x = nil
#endif
(Код любезно предоставлен блогом Джеффа Ламарша.)
Таким образом, вам не нужно просматривать весь код вашего приложения непосредственно перед отправкой вашего приложения и удалять загруженный отладочный код. Это всего лишь один небольшой пример использования этих директив.
Комментарии:
1. Является ли #if таким же, как #ifdef ??
2. Нет — если вы заменили приведенное
#if
выше на#ifdef
(«если определено»), условие будет выполнено успешно, только еслиDEBUG
оно уже определено. Существует также#ifndef
директива препроцессора, которая возвращает противоположный результат («если не определено»).
Ответ №2:
#if
является директивой препроцессора.
if
является языковой конструкцией.
Разница заключается в способе компиляции окончательной программы. При использовании #if
результатом этой директивы является то, что конечная программа будет содержать в этих строках. Когда вы используете языковую конструкцию, выражение, которое передается в конструкцию, будет оцениваться во время выполнения, а не во время компиляции.
Ответ №3:
Предыдущие ответы охватывают #if
использование от отладки до терминологии и пропускают еще одно распространенное использование: #if
используется для комментирования больших фрагментов кода. Это полезно, когда программистам нужно избавиться от чего-то, что уже содержит комментарии.
#if 0
a lof of C code with /* style */ comments included
#endif
Я часто использую это. Преимущество перед любым другим #if
стилем и стилем комментариев — он действительно не заботится о большей части сломанного синтаксиса внутри него.