一、常规格式:如果(1)满足,就执行(2),否则执行(3)
#ifdef (1)
(2)
#else
(3)
#endif
二、常用预处理命令介绍
#if 编译预处理中的条件命令, 相当于C语法中的if语句
#ifdef 判断某个宏是否被定义, 若已定义, 执行随后的语句
#endif #if, #ifdef, #ifndef这些条件命令的结束标志.
#define 定义一个预处理宏
#undef 取消宏的定义
#include 包含文件命令
#include_next 与#include相似, 但它有着特殊的用途
#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配合使用, 判断某个宏是否被定义
#line 标志该语句所在的行号
# 将宏参数替代为以参数值为内容的字符窜常量
## 将两个相邻的标记(token)连接为一个单独的标记
#pragma 说明编译器信息#warning 显示编译警告信息
#error 显示编译错误信息
#define SAFE_RELEASE(obj) if(obj){[obj release];obj=nil;} 释放
1) __VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错, 你可以试试。
2) __FILE__ 宏在预编译时会替换成当前的源文件名
3) __LINE__宏在预编译时会替换成当前的行号
4) __FUNCTION__宏在预编译时会替换成当前的函数名称
三.、利用预处理指令判断当前环境的Xcode版本
-
用xcode 8.3.2运行了如下代码:
四、利用预处理指令进行测试服务器地址和生产服务器地址的切换。链接
#ifdef DEBUG
static NSString *const kFPBaseUrl =@"http://(1)测试服务器地";
#else
static NSString *const kFPBaseUrl =@"http://(2)生产服务器地址";
#endif
五、利用预处理进行开发环境与线上环境的判断
- 通过宏定义一个#define ISDEVBOOL,然后将这个宏作为预处理命令的参数,通过判断这个参数有没有值,来实现开发环境与线上环境的判断。开发中我们手动注释这个值,那么就执行线上环境的BaseUrl;不注释的话,就执行开发环境的BaseUrl.
- 详情请见如下截图:
以上图片有个错误,注意到了吗?没注意的话,项目中会提示如下错误
unterminated conditional directive
- 解决办法:不要忘记写#endif.正确的类似代码如下:
#define ISDEVBOOL
#ifdef ISDEVBOOL // 开发环境
#define REQUEST_MAINLINK_ROOT @"https://ym2.0633hr.com/" // 测试服务器地址
#else
#define REQUEST_MAINLINK_ROOT @"https://yimiaozhaopin.com/" // 正式服务器地址
#endif
六、利用预处理执行进行NSLog或者自定义Log的全局显示和隐藏
-
Release状态下
-
- Debug状态下