预处理程序(宏定义)实际是在编译OC之前处理的语句,预处理程序以#标记,必须是该行的第一个非空格字符。
1、#define语句
#define语句的基本用途之一就是给符号名称指派程序常量。预处理程序语句
#define TRUE 1
定义了名称TRUE的值为1,
int flag=TRUE;
#define语句经常放在程序的开始,#import或者#include语句之后,但是这不是必须得,他们可以出现在程序的任何地方都可以。但是在程序引用这个名称之前必须先定义他们。
#define的好处就是当你要用一个常量的值时,只要在#define的语句中定义,修改时只要在#define的语句中修改就可以了。
惯例:1、预定义的值基本都是大写的,这样做是为了区分变量名,对象名,类名还是预定义名;2、预定义之前都加字母k,这样预定义的值就不用全部大写了,比如:kMaximumValues。对常量值使用预定义名称有助于程序的可读性和扩展性:
#define MAXIMUM_DATA_VALUES 1000
预定义的程序是执行文本替换的,也就是说,直接替换预定义的语句,例如:
#define SQ(x) x*x
使用SQ(x)时有一个陷阱,那就是如果你要加括号运算的话,必须在预定义的时候加:
y=SQ(v+1)
替换成了:
y=v+1*v+1
所以你可以预定义语句写成:
#define SQ(x) ((x)*(x))
这样就可以替换成:
y=((v+1)*(v+1))
2、#import语句
如果你自己开发了一组宏,你可以将所有的宏收入到一个文件里面,然后使用#import语句导入到你要用到的那个文件里面去,#import与#include的区别就是#import不会重复导入同一个文件。
#import “”是导入源文件(从当前目录搜索),#import<>是导入系统库文件(不会从当前目录搜索)。
3、#ifdef、#endif、#else、#elif
有些代码对硬件或者系统有一定的依赖,如果在不同的硬件或者系统上,就必须运行另一套代码,那么怎么样实现在不同的硬件或者系统上运行不同的代码呢?要用到条件编译比如:如果前面已经定义了MAC_OS_X,下面的语句,
#define MAC_OS_X
#ifdef MAC_OS_X
#define SYSTERM @"os_x"
#else
#define SYSTERM @"ios"
#endif
或者可以debug:
#define _DEBUG
#ifdef _DEBUG
#define Log NSLog(@"HelloWorld!")<pre code_snippet_id="611186" snippet_file_name="blog_20150303_11_6920470" name="code" class="objc"><span style="font-family: Arial, Helvetica, sans-serif;">#define DNSLog(...) NSLog(__VA_ARGS__)</span>
#endif
预定义名称的三个点(...)代表可以传多个参数,对应的替换文本__VA_ARGS__
#define isIPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
#define SYSTEM_VERSION_GREATER_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
//G-C-D
#define BACK(block) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)
#define MAIN(block) dispatch_async(dispatch_get_main_queue(),block)
//color
#define RGBCOLOR(r,g,b) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1]
#define RGBACOLOR(r,g,b,a) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:(a)]
获取屏幕宽高:
#define WIDTH [[UIScreen mainScreen] bounds].size.width
#define HEIGHT [[UIScreen mainScreen] bounds].size.height
3、#undef语句
在一些情况下,可能需要使一些已经定义的名称变成未定义的,通过使用#undef语句就可以了:
#undef name
注:预定义会将所有以斜线(\)结尾的行连接成一行。