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运行了如下代码:


    image.png

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


#ifdef DEBUG

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

#else

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

#endif

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

  • 通过宏定义一个#define ISDEVBOOL,然后将这个宏作为预处理命令的参数,通过判断这个参数有没有值,来实现开发环境与线上环境的判断。开发中我们手动注释这个值,那么就执行线上环境的BaseUrl;不注释的话,就执行开发环境的BaseUrl.
  • 详情请见如下截图:
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状态下


      image.png

      Snip20170527_11.png
    1. Debug状态下
image.png

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,490评论 25 708
  • 1.运动:走跑30分钟 2.阅读:《抗日战争》30页 3.单词:百词斩30个 4.练字:硬笔字帖1页 5.听书:1...
    吴兴老鱼阅读 139评论 0 0
  • 众所周知,StatsD 负责收集并聚合测量值。之后,它会将数据传给 Graphite,后者以时间序列为依据存储数据...
    OneAPM阅读 1,800评论 0 3
  • 牛扎糖、利是糖、瑞士糖伴随我长大。前者随着时间变迁味道千变万化,后两者一直都是同一品牌味道无差。每次见到牛扎糖都会...
    虚心竹阅读 792评论 0 3