#define和预处理指令--(妖妖随笔)
预处理过程是先于编译器对源代码进行处理(进行初步的转换),产生新的源代码提供给编译器。
格式:预处理指令是以#开头的代码行,#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。
#空指令 没有任何效果
#include 引入一个源代码文件
#define 定义宏
#undef 取消定义宏
#if 如果条件为真,则编译下面的代码
#elif 如果前面的#if不为真,则编译下面的代码
#endif 结束一个#if...#elif条件编译块
#ifdef 如果已经定义了某个宏,则编译下面的代码
#ifndef 如果没有定义某个宏,则编译下面的代码
#error 停止编译并显示错误信息
1.防止重复引用的代码:
#ifndef A_H 意思是"if not define a.h" 如果不存在a.h
#define A_H 就引入a.h
#endif 否则不需要引入
#ifndef _OBJC_RUNTIME_H //如果不存在_OBJC_RUNTIME_H
#define _OBJC_RUNTIME_H //就引入_OBJC_RUNTIME_H(定义宏)
#include <objc/objc.h> //引入文件
#include <stdarg.h>
#include <stdint.h>
#include <stddef.h>
#include <Availability.h>
#include <TargetConditionals.h>
#if TARGET_OS_MAC //如果条件为真,就编译下面的代码
#include <sys/types.h>
#endif //结束条件编译块
2.根据条件创建一个Button:
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(0, 0, 100, 100);
[btn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
但是根据新的需求,这个Button暂时不需要显示在界面上面,这时候可以使用预处理指令来进行条件判断
(1)第一种方法,定义一个具体的宏
#define _SHOWBTN_ 0
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(0, 0, 100, 100);
[btn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
#if _SHOWBTN_
[self.view addSubview:btn]; //如果需要显示按钮,将其添加到父视图中
#else
//不将其添加到父视图中
#endif
}
使用:这时候如果想显示该Button对象,那么将#define _SHOWBTN_ 1,否则写为#define _SHOWBTN_ 0
(2)第二种方法(定义一个没有数值的宏)
#ifdef _SHOWBTN_
[self.view addSubview:btn];
#endif
这段代码的意思就是如果定义了宏_SHOWBTN_,那么就将btn添加到父视图,如果没有定义的话,那么不添加到父视图。
使用:这时候如果我们想要将其添加到父视图,则在文件的顶部写上#define _SHOWBTN_