预处理宏使用指南
预处理就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。
常用宏说明
#define 定义一个预处理宏
#undef 取消宏的定义
#if 编译预处理中的条件命令, 相当于C语法中的if语句
#ifdef 判断某个宏是否被定义(#define过), 若已定义, 执行随后的语句
#ifndef 与#ifdef相反, 判断某个宏是否未被定义
#elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if
#else 与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else
#endif #if, #ifdef, #ifndef这些条件命令的结束标志.
defined 与#if, #elif配合使用, 判断某个宏是否被定义
#pragma 说明编译器信息
#warning 显示编译警告信息
#error 显示编译错误信息
宏的使用步骤
1.如在 "Target > Build Settings > Preprocessor Macros > Debug" 设置"DEBUG=1”。
2.之后在pch或工具类中就可以这么写了:
#ifdef DEBUG
(debug 模式下的配置)
#else
(release 模式下的配置)
#endif
#ifdef使用说明
#ifdef _XXXX //(ifdef=>if define)
代码块1
#elif defined _YYYY //(相当于else if)
代码块2
#else
代码块3
#endif
如果_XXXX已被#define或Preprocessor Macros中定义过,则对代码块1进行编译,如果没有定义_XXXX但定义了_YYYY,则编译代码块2,否则只对代码块3进行编译。
注意:#ifdef后面接的是一个宏
#ifndef使用说明
#ifndef _XXXX //(ifndef=>if not define)
代码块1
#else
代码块2
#endif
#ifndef和#ifdef是相反的情况,如果没有定义宏_XXXX,那么就会编译代码块1,否则会编译代码块2
#if使用说明
#if 常量或表达式
代码块1
#else
代码块2
#endif
如果常量为真(非0),就编译代码块1,否则编译代码块2
注意:#if后必须是常量,不能是宏,因为宏是运行阶段才有,#if是预编译阶段,会找不到宏
最后强调一点:这几个宏定义只是决定代码块是否被编译,而不是被执行。
常用示例
1.判断真机或模拟器
#if TARGET_OS_IOS
NSLog(@"真机测试");
#endif
#if TARGET_IPHONE_SIMULATOR
NSLog(@"模拟器");
#endif
2.获取当前设备的iOS版本
#define kIOSVersion [[UIDevice currentDevice].systemVersion doubleValue]
网友评论