1. 预处理概念
预处理是指程序在编译之前,预处理器对源代码的预处理指令进行处理(例如宏替换), 得到一份新的源代码, 编译器再对新的源代码进行编译, 如图所示:
预处理分为宏定义、文件包含、条件编译。
预处理指令以#开头。
2. 宏定义
宏定义分为不带参数的宏定义和带参数的宏定义
(1) 不带参数的宏定义
格式: #define 宏名 字符串
原理: 在预处理时, 预处理器将源程序中的宏定义的【宏名】全部替换为【字符串】,常用来定义常量
范例:
#define Count 15
int main ()
{
int sum = Count + 30;
NSLog(@"sum = %d", sum);
}
源代码经过预处理(替换)后, 会生成一份新的源代码:int main ()
{
int sum = 15 + 30;
NSLog(@"sum = %d", sum);
}
(2) 带参数的宏定义
格式:#define 宏名(参数列表) 字符串
原理:预处理器会将源代码中的【宏名】替换为【字符串】, 并将字符串中的参数用宏名右边的参数列表进行替换。
范例:
#define sum(a, b) a+b
int main ()
{
int result = sum(10, 20);
NSLog(@"%d", result);
}
经过预处理后的源代码:int main ()
{
int result = 10+20;
NSLog(@"%d", result);
}
(3) 带参数的宏定义与函数有些类似, 但是本质是不同的,带参数的宏定义作用于预处理时, 而函数调用发生在运行时。带参数的宏定义比函数效率更高。
(4) 宏定义的优点:
一、方便程序修改
二、提高程序的效率
3. 文件包含
文件包含的指令是#include, 该指令可以将一个文件的内容全部拷贝到另外一个文件。
(1) #include <文件名>
预处理器会直接到C语言库函数的所在头文件目录中寻找文件, 然后拷贝内容到当前文件
(2) #include "文件名"
预处理器会首先到C语言库函数所在头文件目录中寻找文件,找不到就会到项目中寻找自定义的文件, 然后拷贝内容到当前文件
4. 条件编译
程序中的部分代码在满足一定条件时, 才参与编译
范例:
#define score 71
int main ()
{
#if score>90
NSLog(@"成绩大于90");
#elif score>80
NSLog(@"成绩大于80");
#else
NSLog(@"成绩小于等于80");
#endif
return 0;
}
经过预处理后的源代码为:int main ()
{
NSLog(@"成绩小于等于80");
return 0;
}