Objective C的“#if”语法

22

当我查看一些类时,我对"pound if"或者说#if语法有些困惑。

例如:

#if someConstant == someNumber
  do something
#elif
  etc

对比:

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

有什么区别,为什么要使用 #if

3个回答

35

#if等是预处理器指令。这意味着它们在编译之前就被处理,而不是在运行时处理。例如,当你为debug构建时定义调试行为,只有在编译时才会编译,而不是在release构建时编译,这是很有用的:

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

(代码来自Jeff LaMarche的博客。)

这样,您就不需要在提交应用程序之前再次查看整个应用程序的代码并删除大量调试代码。这只是这些指令用法的一个小例子。


#if和#ifdef是一样的吗? - Lee Probert
不 - 如果您将上面的 #if 替换为 #ifdef(“如果已定义”),则条件仅在已定义 DEBUG 的情况下成功。还有一个 #ifndef 预处理器指令,它返回相反的结果(“如果未定义”)。 - Stuart

13

#if是一种预处理器指令

if是一种语言结构

它们之间的区别在于最终程序编译成的方式。当您使用#if时,该指令的结果是最终程序将包含这些行。而当您使用语言结构时,传递给结构的表达式将在运行时而不是在编译时进行评估。


0

之前的回答涵盖了从调试到术语学的#if用法,但忽略了另一种常见用法:#if用于注释大块代码。当程序员需要摆脱已经包含注释的内容时,这非常有用。

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

我经常使用这个。相较于任何其他的#if和注释风格——它真的不关心其中大部分破损的语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接