在编译前进行解析处理的指令
源代码 —> 编译预处理 —> 编译 —> 链接 —> 运行
编译预处理指令
1.宏定义 #define
1.1 不带参数的宏定义
1.2 带参数的宏定义
2.条件编译
3.文件包含 #include
编译预处理指令 :
1.所有的编译预处理指令都是以#号开头
2.所有的编译预处理指令都不需要分号
宏名的命名规范
1.全部大写有多个单词中间使用下划线隔开(常用)
2.以K开头的驼峰标识(不常用)
不带参数的宏定义 : 在预编译的时候所出现宏名标识的地方都会被替换成宏名后面的值
注意点 :
1.在注释中的宏名不会替换
2.在字符串中出现的宏名不会被替换
#define LEN 10
for(int i = 0;i < LEN;i++){
int nums[LEN] = { 1 , 2 };
};
带参数的宏定义 : 把出现宏名表达式的地方都会把宏名后面小括号中的参数代入到宏后面的表达式中, 然后进行替换
#define 宏名 ( 参数列表 ) 表达式
注意点:
1.参数列表中没有类型
2.宏名与括号之间一定不要加空格
#define MAX(num1,num2) num1 > num2 ? num1 : num2
int max(int num1,int num2)
{
return num1 > num2 ? num1 : num2
}
int main ()
{
int rs = max(10,2);
}
带参数的宏与函数的区别
1 .函数有一个调用过程 , 会开辟一个新的存储空间 , 需要花费一些开销
2.宏仅仅是做一个替换的操作
使用场景 :
1.当计算比较简单 , 参数比较少的时候使用宏, 宏提高运算效率
2.当逻辑比较复杂 , 参数多的时候使用函数
宏的注意点 :
1.如果做题 , 宏仅仅是做一个替换操作
2.如果自己写宏定义 , 那么所有出现参数以及运算结果的地方都要加上括号
3.宏有一些固有的缺点是没有办法消除的 , 在使用带参数宏的时候不要在参数中使用++ -- += -= /= *= %=