Объективный синтаксис "#if" - PullRequest
19 голосов
/ 07 октября 2011

Я немного сбит с толку синтаксисом "pound if" или #if, который я вижу, когда смотрю на некоторые классы.

Например:

#if someConstant == someNumber
  do something
#elif
  etc

против

if (someConstant == someNumber) 
   do something
else if {
   do more stuff
}

в чем разница, и зачем использовать #if?

Ответы [ 3 ]

29 голосов
/ 07 октября 2011

#if и т. Д. Являются директивами препроцессора. Это означает, что они рассматриваются до компиляции, а не во время выполнения. Это может быть полезно, например, при определении поведения отладки, которое компилируется только при сборке для debug, а не release:

#if DEBUG
    #define ISRelease(x) [x release]
#else
    #define ISRelease(x) [x release], x = nil
#endif

(Код любезно предоставлен Jeff LaMarche's blog .)

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

11 голосов
/ 07 октября 2011

#if является директивой препроцессора .

if является языковой конструкцией .

Разница в том, чтоокончательная программа составлена ​​в.Когда вы используете #if, результатом этой директивы будет то, что будет заключительная программа в этих строках.При использовании языковой конструкции выражение, переданное в конструкцию, будет оцениваться в время выполнения , а не время компиляции .

0 голосов
/ 07 марта 2016

Предыдущие ответы охватывают #if использования от отладки до терминологии и пропускают еще одно общее использование: #if используется для комментирования больших кусков кода.Это полезно, когда программистам нужно избавиться от чего-то, что уже содержит комментарии.

#if 0
  a lof of C code with /* style */ comments included
#endif

Я часто этим пользуюсь.Преимущество перед любым другим #if и стилем комментариев - его действительно не волнует большая часть нарушенного синтаксиса в нем.

...