ios-View相关iOS开发 Objective-C

OC中编译预处理(宏定义、“文件包含”处理及条件编译)

2018-05-05  本文已影响107人  Coder_Cat

编译预处理

1.宏定义

1.无参数宏定义如下:

#define HEIGHT 60.0f
#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width

无参数宏通常用来定义一个常量
2.有参数宏定义如下:

//获取两个数的最小值和最值
#define MIN(A,B) ( (A) > (B) ? (B) : (A) )
#define MAX(A,B) ( (A) > (B) ? (A) : (B) )

注意:宏定义的变量在引用的时候,用 ()括起来,防止预处理器展开的错误
3.当一个宏的表达式很长时,可以在每行后面用反斜杠""来连接(作用屏蔽换行符),表明宏是一整段表达式;

//获取三个数最大值
#define MAXVALUE(A,B,C) ({\
  int D = A>B?A:B;\
  C>D?C:D;\
})
NSLog(@"最大值:%zd",MAXVALUE(10, 20,30));

结果:


获取三个数最大值

4.关于#与##的操作符
<1>“#”的功能是将其后面的宏参数进行字符串化操作,意思就是对它所应用的宏变量通过替换后在其左右各加上一个双引号。

#define STRING(A) ({\
printf(#A);\
})
 STRING(ABCD);

结果

结果
<2>连接符##用来将两个token连接为一个token,但它不可以位于第一个token之前or最后一个token之后。注意这里连接的对象只要是token就行,而不一定是宏参数,但是##又必须位于宏定义中才有效,因其为编译期概念(比较绕)。
示例子可见:OC单例模式详解
5.宏取消
宏定义必须写在方法之外,其作用域为宏定义命令起到程序结束;如果我们想在程序的某一个地方终止宏的作用域,就要使用#undef命令。
#define A 20
- (void)viewDidLoad {
    [super viewDidLoad];

    NSLog(@" 最大值:%zd",A);
#undef A
    NSLog(@" 最大值:%zd",A);
}
这里写图片描述

结果可见:由于在41行时取消了宏,此后再调用宏时就会报错

2.文件包含

3.条件编译

1.#ifdef使用:

这里写图片描述
作用是当标识符已经被定义过(一般使用#define进行定义),就对程序段1进行编译,否则编译程序段2。
#define X
- (void)viewDidLoad {
    [super viewDidLoad];
#ifdef X
    NSLog(@"定义过了X");
#else
    NSLog(@"未定义过了X");
#endif
}

结果:


这里写图片描述
#define X
- (void)viewDidLoad {
    [super viewDidLoad];
#ifdef X
    NSLog(@"定义过了X");
#endif
}

结果:

这里写图片描述
2.#ifndef使用:
#ifndef使用
- (void)viewDidLoad {
    [super viewDidLoad];
#ifndef X
    NSLog(@"未定义过了X");
#endif
}
#ifndef使用
3.#if使用
#if预处理程序语句提供控制条件编译的更加通用的方法。
#if使用

4.编译预处理指令:

编译预处理指令
上一篇 下一篇

猜你喜欢

热点阅读