iOS预处理指令及其应用 (宏)【例如#ifdef】

一、常规格式:如果(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运行了如下代码:


    iOS预处理指令及其应用 (宏)【例如#ifdef】_第1张图片
    image.png

四、利用预处理指令进行测试服务器地址和生产服务器地址的切换。链接


#ifdef DEBUG

static NSString *const kFPBaseUrl =@"http://(1)测试服务器地";

#else

static NSString *const kFPBaseUrl =@"http://(2)生产服务器地址";

#endif

五、利用预处理进行开发环境与线上环境的判断

  • 通过宏定义一个#define ISDEVBOOL,然后将这个宏作为预处理命令的参数,通过判断这个参数有没有值,来实现开发环境与线上环境的判断。开发中我们手动注释这个值,那么就执行线上环境的BaseUrl;不注释的话,就执行开发环境的BaseUrl.
  • 详情请见如下截图:
iOS预处理指令及其应用 (宏)【例如#ifdef】_第2张图片
Snip20170614_38.png

以上图片有个错误,注意到了吗?没注意的话,项目中会提示如下错误

  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的全局显示和隐藏

    1. Release状态下


      iOS预处理指令及其应用 (宏)【例如#ifdef】_第3张图片
      image.png

      iOS预处理指令及其应用 (宏)【例如#ifdef】_第4张图片
      Snip20170527_11.png
    1. Debug状态下
iOS预处理指令及其应用 (宏)【例如#ifdef】_第5张图片
image.png

iOS预处理指令及其应用 (宏)【例如#ifdef】_第6张图片
image.png

你可能感兴趣的:(iOS预处理指令及其应用 (宏)【例如#ifdef】)