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