1、先来几个常用的:
- // 是否高清屏
- #define isRetina ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO)
- // 是否模拟器
- #define isSimulator (NSNotFound != [[[UIDevice currentDevice] model] rangeOfString:@"Simulator"].location)
- // 是否iPad
- #define isPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
- // 是否iPad
- #define someThing (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)? ipad: iphone
2、基本的使用:
- //定义π值 3.1415926
- #define PI 3.1415926
- //则在程序用可以如下使用
- double i=2*PI*3;
- //效果相当于 double i=2*3.1415926*3;
- //预处理命令可以定义任何符合格式的形式,例如判断年份是否闰年
- #define IS_LEAP_YEAR year%4==0&&year%100!=0||year%400==0
- //使用时则可以直接
- if(IS_LEAP_YEAR)
- //或者可以定义一个参数
- #define IS_LEAP_YEAR(y) y%4==0&&y%100!=0||y%400==0
- //使用时则可以直接
- int ys=2012;
- if(IS_LEAP_YEAR(ys))
- //通常预处理程序定义在一行 如果好分行 比如说太长需要换行 需要使用“/”符号 表示还有下一行,多行分列也是如此,例:
- #Define IS_LEAP_YEAR year%4==0&&year%100!=0/
- ||year%400==0
- //宏定义参数后边放一个# 那么在调用该宏时,预处理程序将根据宏参数创建C风格的常量字符串 例:
- #define STR(x) # x
- //将会使得 随后调用的
- NSLOG(STR(Programming in Objective-c./n));
- //显示结果为 Programming in Objective-c./n
3、关于#与##的操作符:
<1>.宏定义中字符串化操作符#:
#的功能是将其后面的宏参数进行字符串化操作,意思就是对它所应用的宏变量通过替换后在其左右各加上一个双引号。例如
- #define WARN_IF(EXPR)\
- do {\
- if (EXPR)\
- fprintf(stderr, "Warning: " #EXPR "\n"