预处理指令的种类:
文件包含、宏定义、条件编译
1.文件包含:
OC中一般使用#import,而C语言下通常使用include
区别在于#import 不会导致重复引用。
OC中还有个@class关键字,一般用于头文件声明。
2.宏定义:
不含参数
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define kScreenHeight [UIScreen mainScreen].bounds.size.height
带有参数:
#define kScreenRatio (kScreenWidth/kScreenHeight)
#define max_int(a,b) 2+3
需要注意:宏定义的本质是替换,所以在做逻辑运算的时候要小心,应该在适当的位置上加上括号,否则可能会出现意料外的结果:
#define max_resut max_int*max_int
结果是11
而我们预期的结果是5 * 5 = 25
那么我们替换一下:2+3*2+3 = 11
所以请记得按照逻辑运算优先级适当的加上括号。
宏的拼接
#define a @"123"
#define b @"456"
#define c a@" "b
NSLog(@"%@",c);
log:123 456
宏的连接处理
如果想在含参数宏中包含参数本身:
#define MAX_LOG(logParam) NSLog(@"lalala testLog"#logParam"end",logParam * 2)
执行:
MAX_LOG(10)
结果:
log:lalala testLog 20end
宏定义的换行
在末尾加上反斜杠就可以了
条件编译则是在编译之前,由预处理器判断范围内代码是否满足条件来确认是否将其编译进去。
常见条件编译:
#if //基本等于C中的if
#ifdef //后跟宏的名称 意思是 ‘如果定义了宏’,则执行其后的语句
#ifndef //与上一条相反,如果未定义,则执行其后的语句
#elif //上述条件语句条件都不符合,或前面的elif语句也不符合,则执行其后的代码
#else //...就是C里的else
#endif //结束标志
注意哈:#if是判断后面的条件 #ifdef 是判断后接的宏是否被定义