免费开源的iOS开发学习平台

OC预处理:2-条件指令编译#if/#elif/#else/#ifdef/#ifndef

条件编译指令将决定哪些代码被编译,而哪些是不被编译的。根据表达式的值或者某个特定的宏是否被定义来确定编译条件。

#if/#elif/#else

  • #if 指令检测跟在关键字后的宏或者常量表达式的值,如果值为真,则编译后面的代码,直到出现#else#elif#endif为止,反之则不执行;
  • #elif 预处理指令综合了 #else 和 #if 指令的作用,类似于else if;
  • #else 指令用于某个 #if 指令之后,当前面的 #if 指令的条件不为真时,就编译 #else 后面的代码。
#define IOS10 1
#define IOS9 0
int main(int argc, const char * argv[]) {
    @autoreleasepool {
// 如果 IOS10 值为真时,输出It is an iOS10 device!;若 IOS10 值为假且 IOS9 值为真时,输出It is an iOS9 device!;否则输出It is a device NOT runing iOS10 or iOS9!
// #if 和 #endif 配对出现,#endif 用于终止 #if 预处理指令      
#if IOS10
        NSLog(@"It is an iOS10 device!");
#elif IOS9
        NSLog(@"It is an iOS9 device!");
#else
        NSLog(@"It is a device NOT runing iOS10 or iOS9!");
#endif       
    }
    return 0;
}

运行结果如下。大家可以自行修改宏定义中IOS10和IOS9的值,看一下运行结果的变化情况。

#ifdef

#ifdef 等价于 #if defined,如果后面跟的宏被定义过,则执行下面的代码。

#define RUN
int main(int argc, const char * argv[]) {
    @autoreleasepool {     
#ifdef RUN
        NSLog(@"defined...");
#endif     
    }
    return 0;
}

运行结果:

#ifndef

#ifndef 和 #ifdef 相反,如果后面跟的宏没有被定义过,则执行下面的代码。

int main(int argc, const char * argv[]) {
    @autoreleasepool { 
#ifndef RUN
        NSLog(@"not defined...");
#endif
    }
    return 0;
}

运行结果:

示例代码

https://github.com/99ios/6.3.3