2014-04-25 108 views
1

在Objective-C(我工作的iOS SDK),我可以使用以下2种方式分支条件:#if和if子句之间的区别?

方法1

#if TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR 
    // Branch A 
# elif TARGET_OS_IPHONE && TARGET_IPHONE_SIMULATOR 
    // Branch B 
# endif 

方法2

if(TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR) { 
    // Branch A 
} else { 
    // Branch B 
} 

2种方法有什么区别?我注意到Xcode在方法1中没有检测到分支内的编码错误。

注:TARGET_OS_IPHONE & TARGET_IPHONE_SIMULATOR是2个用于标识设备类型的宏。

回答

2

if是您的代码中的条件;它会在您的代码运行时进行检查。

#if是预编译器指令;它决定在编译器看到它之前是否弹出代码。 (正如你所说的,Xcode能够做出这个决定,甚至不需要编译你的代码,所以它消除了代码弹出的代码,如代码完成。)

这部分是由什么样的事情决定的,明显。如果这是一个决定可以编译之前 - 即它是关于编译/构建过程本身 - 然后#if是合理的。如果在代码实际运行之前不能确定的话,当然#if是不可能的。

+0

我明白了。在这种情况下,我们应该使用预编译器指令而不是条件子句?我发现自己更适合使用条件子句,因为它会发现错误。 – Raptor

+1

预编译器指令适用于确保某些代码行在某些情况下不会显示。例如,有些人使用'#if DEBUG'来包装'NSLog'调用,这样就没有登录最终版本的危险。 – matt

+1

另外我用它来试验或者演示完成独立的做同样事情的方法,如下所示:https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch02p070filters/ch15p419filters /ViewController.m – matt

2

有时,由于条件编译,预处理器指令可以使用常规的if语句完成一些不可能的事情。例如,尝试使用if语句来实现这个无可否认虚假造作的例子:

#include <stdio.h> 

#define USE_LONG 

int main(void) { 

#ifdef USE_LONG 
    long my_var = 0; 
#else 
    int my_var = 0; 
#endif 

    printf("Value plus 5 is %ld\n", my_var + 5l); 

    return 0; 
} 

,你会得到一个未声明的标识符,如果你试图用一个if语句来做到这一点,因为my_var声明将被限制在任何情况下包含块的范围。

这些常见用例是通过选择不同的代码块来根据#ifdef WINDOWS#ifdef MAC或任何结果是真的来编译的代码块,当这些系统具有不同且不兼容的函数调用时达到同样的目的。

相关问题