Синтаксис Objective C «#if»

#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 стилем и стилем комментариев — он действительно не заботится о большей части сломанного синтаксиса внутри него.