什么是宏定义?
通常宏定义的格式为:#define 标识符 字符串 相信大家都见过非常多了,通常我们编译过程中的预处理(预编译)工作又叫宏展开,将代码中的宏名替换为字符串。
为什么要用宏函数?
宏函数虽然在处理复杂的函数(例如递归函数)时宏会降低代码的执行效率,但是对于逻辑简单的函数来说,准确的使用宏函数往往能提高程序的执行效率,因为在主函数中调用普通函数的时候需要进行入栈跟出栈操作,而宏函数不用,宏函数只是进行简单的直接替换,所以能对代码的执行效率有一定的提升。当然也有不好的一面,使用了宏函数跟使用普通函数比较起来生成的目标文件会比较大,因为宏函数的直接插入导致在代码中多了一份拷贝。
什么是宏函数?
宏函数其实就是上面的字符串写成一个完整的函数体。下面写一个大家熟悉的宏函数?
#define MIN(x, y) ((x < y) ? x : y)
是不是经常有见到!
下面我们来对一个简单的普通函数跟宏函数做个对比:
#include <iostream>
// 宏函数
// 写法1 (调用该宏前必须存在min变量)
#define MYFUNC(x, y)\
{\
min = x < y ? x : y;\
}\
// 写法2
#define MYFUNC2(x, y, min)\
{\
min = x < y ? x : y;\
}\
// 普通函数
void MyFunc(const int x, const int y, int &min)
{
// 通过引用获取x跟y的最小值
min = x < y ? x : y;
}
int main(void)
{
int x = 1, y = 2, min = 0;
MyFunc(x, y, min);
std::cout << "MyFunc: " << min << std::endl;
x = 3, y = 4;
MYFUNC(x, y);
std::cout << "MYFUNC: " << min << std::endl;
x = 5, y = 6;
MYFUNC2(x, y, min);
std::cout << "MYFUNC2: " << min << std::endl;
return 0;
}
输出结果:
MyFunc: 1
MYFUNC: 3
MYFUNC2: 5
因为宏的参数替换是直接替换的,所以写法一是可行的。
上面的对比还无法看出宏函数的多少优势,那接下来我们进行对函数进行改造,将函数作为参数传入到我们的参数里面。
#include <iostream>
#include <string>
// 写法1
// 调用该宏前必须存在min变量
#define MYFUNC(x, y, fun1)\
{\
min = x < y ? x : y;\
fun1("MYFUNC", x, y);\
}\
// 写法2
#define MYFUNC2(x, y, min)\
{\
min = x < y ? x : y;\
printfun("MYFUNC2", x, y);\
}\
typedef void(*Fun1)(const std::string, const int, const int);
void printfun(const std::string str, const int x, const int y)
{
// 用于输出x+y的值
int sum = x + y;
std::cout << str << " sum is : " << sum << std::endl;
}
// 普通函数
void MyFunc(const int x, const int y, int &min, Fun1 fun1)
{
// 通过引用获取x跟y的最小值
min = x < y ? x : y;
fun1("MyFunc", x, y);
}
int main(void)
{
int x = 1, y = 2, min = 0;
MyFunc(x, y, min, printfun);
std::cout << "MyFunc: " << min << std::endl;
x = 3, y = 4;
MYFUNC(x, y, printfun);
std::cout << "MYFUNC: " << min << std::endl;
x = 5, y = 6;
MYFUNC2(x, y, min);
std::cout << "MYFUNC2: " << min << std::endl;
return 0;
}
运行结果:
MyFunc sum is : 3
MyFunc: 1
MYFUNC sum is : 7
MYFUNC: 3
MYFUNC2 sum is : 11
MYFUNC2: 5
因为要将函数作为参数进行传递,所以这里我用到了函数模板Fun1,可以发现如果使用宏函数的话是不需要使用函数模板的,但是使用普通函数的话是必须使用的,因为这里必须将函数作为参数进行传递,而宏函数因为是直接替换到代码里面的所以这里可以直接使用,当然也可以将函数传到宏的参数里,但是宏的参数是不需要参数类型的,所以这里使用宏函数的话可以帮我们减少挺多的工作量,与此同时还能提高程序的效率,当然要注意别写错!别写错!。