带参宏和带参函数的比较(C语言)

 例:分别通过宏定义和函数方式求a和b的乘积

#include<stdio.h>
#define mult_macro(a,b) a*b
int mult_fun(int a, int b){
	return a*b;
}
int main(){
    int a=11,b=6;
	printf("%d\n",mult_fun(a+b,a-b));
	printf("%d",mult_macro(a+b,a-b));
} 

分别使用不同的方式求值运行代码和时间如下:    

函数方式:  

 带参宏方式:

可以看到两种方法的运行时间宏会快一些,而且结果也不同这是为什么呢。

        因为函数传参会将参数优先计算出结果然后参与计算,而宏调用时进行替换,并不考虑优先级,所以宏替换后a*b就替换为了a+b*a-b改变了原有的优先级导致结果不同。

        其次两者的生效位置也不同,宏会在编译时就进行展开从而影响编译的时间,而函数则是在程序运行时生效(分配内存、返回值、传参)影响程序的运行时间

        并且因为宏定义的替换形式,在多次调用时会在编译阶段全部替换,在宏定义有一定代码量的情况下会导致程序的存储大小增大,而函数并不会出现重复代码。宏定义中并不存在调试(即无法对宏运行中出现的问题进行调试)和递归。

函数宏定义
参数类型优先计算,一一对应无要求,会导致优先级错误
调用形式形参带入字符替换
生效时间程序运行时编译时展开替换
优点

函数规模大,但是可以有效减少代码,多次调用也不会产生重复代码

宏规模小,速度快,但是会增加代码量,浪费资源,多次调用会产生重复代码
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值