#if和if子句之间的区别?

时间:2014-04-25 02:59:14

标签: objective-c

在Objective-C(我正在使用iOS SDK)中,我可以使用以下两种方式来分支条件:

方法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
}

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

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

2 个答案:

答案 0 :(得分:2)

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

#if是预编译器指令;它决定了在编译器看到代码之前代码是否被弹出。 (正如您所说的那样,Xcode能够在不编译代码的情况下做出此决定,因此它可以避免考虑弹出的代码,例如代码完成。)

显然,部分原因在于决定了什么样的事情。如果这是在编译之前可以做出的决定 - 也就是说,它是关于编译/构建过程本身的事情 - 那么#if是合理的。如果在代码实际运行之前无法确定某些内容,那么当然#if是不可能的。

答案 1 :(得分: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选择不同的代码块进行编译,或者在这些系统具有的情况下进行编译时,使程序更具可移植性,比方说,不同的和不兼容的函数调用可以达到同样的目的。