宏函数:
什么是宏函数:
宏函数不是真正的函数,而是带参数的宏替换,只是使用方法像函数而已。
在代码中使用宏函数,预处理时会经历两次替换,第一次把宏函数替换成它后面的一串代码、表达式,第二次把宏函数中的参数替换到表达式中。
#define 宏名(a,b,c,...) a+b*c
普通函数:
什么是普通函数:
函数就是一段具有某一项功能的代码,它是C语言中管理代码的最小单位,把具有某项功能的若干行代码封装在函数中方便管理代码且方便重复调用。
宏函数与普通函数的优缺点:
宏函数的优点:
1、执行速度快,它不是真正的函数调用,而是代码替换,不会经历传参、跳转、返回值。
2、不会检查参数的类型,因此通用性强。
宏函数的缺点:
1、由于它不是真正的函数调用,而是代码替换,每使用一次,就会替换出一份代码,会造成代码冗余、编译速度慢、可执行文件变大。
2、没有返回值,最多可以有个执行结果。
3、类型检查不严格,安全性低。
4、无法进行递归调用。(自己调用自己)
普通函数的优点:
1、不存在代码冗余的情况,函数的代码只会在代码段中存储一份,使用时跳转过去执行,执行结束后再返回,还可以附加返回值。
2、安全性高,会对参数进行类型检查。
3、可以进行递归调用,实现分治算法。
普通函数的缺点:
1、相比宏函数它的执行速度慢,调用时会经历传参、跳转、返回等过程,该过程耗费大量的时间。
2、类型专用,形参什么类型,实参必须是什么类型,无法通用。
什么样的代码适合封装成宏函数?
1、代码量少,即使多次使用也不会造成代码段过度冗余。
2、调用次数少,但执行次数多,也就是宏函数会在循环语句中调用。
#include <stdio.h>
#define FUNC(a,b) do{typeof(a) t=(a);(a)=(b);(b)=t;}while(0)
int main()
{
int a=1,b=2;
FUNC(a,b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
3、函数的功能对返回值没有要求,也就是函数的功能不是通过返回值达到的。