目录
一、概念
1.宏是什么?
一种替换机制,编译程序前会对代码中的文本做出替换。
宏是一种替换机制。它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。
2.为什么要有宏?
提高代码可读性,宏函数还可以提高效率。
3.怎么使用宏?
用#define定义宏。
二、宏函数
eg. 求和宏函数
#define ADD(a, b) ((a) + (b))
要检查宏函数写的是否正确也很简单,就是看能不能在调用宏函数的代码中直接替换。
如最常见的错误在宏函数末尾加上了分号,这时我们将代码替换,这局代码中就会出现两个分号。
eg. 将宏函数带入代码中检查
三、宏的优缺点?
1.优点a. 提高代码的可读性,方便修改。b. 宏函数还可以提高效率 。
2.缺点a. 不方便调试:因为宏是在预编译阶段进行替换的,一些由宏导致的问题在调试时难以被发现。b. 可能会引起代码的膨胀:宏的展开可能会导致代码的膨胀,从而增加程序的内存消耗。c. 可能会增加编译时间:由于宏的展开是在编译时进行的,因此可能会增加编译时间。d. 边界效应:由于宏定义的时候,其各个分量未加括号,而在使用宏定义的时候,传递的参数是变量的表达式,然后经过系统展开后,由于优先级的原因,导致其结果不是你所希望的。
四、C++有哪些技术替代宏?
1. 常量的宏定义 用 const、enum来代替
2. 宏函数 用 内联函数(inline)来代替
【总结】
【源代码】
//宏函数
#include<bits/stdc++.h>
#define Add(a, b) ((a) + (b))
//错误一:加了参数类型
//#define Add(int a, int b) ((a) + (b))
//错误二:中间有加号
//#define Add(a + b) ((a) + (b))
//错误三:没有加括号
//#define Add(a, b) a+b
//错误四:末尾加分号
//#define Add(a, b) ((a) + (b));
//要时刻记住宏函数的作用是替换,用后面的字符串替换源代码
//要检查宏函数的定义是否正确也很简单,直接把后面的字符串替换回代码中即可
int main()
{
int a = Add(2, 3); // ((2) + (3))
int b = Add(2, 3) * 3; // ((2) + (3))*3
int c = Add(Add(2, 4), 3); // ((((2) + (3))) + (3))
return 0;
}
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。