宏和函数的区别

宏通常被应用于执行简单的运算。比如在两个数中找出较大的一个。
#define MAX(a, b) ((a)>(b)?(a):(b))
那为什么不用函数来完成这个任务? 原因有二:
1. 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更更多。所 以宏比函数在程序的规模和速度方面更胜⼀一筹。
2. 更更为重要的是函数的参数必须声明为特定的类型。所以函数只能在类型合适的表达式上使用。反之这个宏怎可以适⽤用于整形、长整型、浮点型等可以用于>来比较的类型。宏是类型无关的。
当然和函数相比宏也有劣势的地方:
1. 每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增 加程序的长度。 
2. 宏是没法调试的。 
3. 宏由于类型无关,也就不够严谨。 
4. 宏可能会带来运算符优先级的问题,导致程容易出现错。

宏有时候可以做函数做不到的事情。比如:宏的参数可以出现类型,但是函数做不到
#define MALLOC(num, type)\ 
   (type *)malloc(num * sizeof(type)) 
... 
// 使用 
MALLOC(10, int);// 类型作为参数
// 预处理器替换之后:
 (int *)malloc(10 * sizeof(int))


带副作用的宏参数
当宏参数在宏的定义中出现超过⼀一次的时候,如果参数带有副作用,那么你在使用这个宏的时候 就可能出现危险,导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。
x+1;// 不带副作用 
x++;// 带有副作用


命名约定

⼀一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是:
把宏名全部大写 函数名不要全部大写

宏和函数的一个对比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值