宏的缺陷

在c中,保持效率的一个方法是使用宏,宏可以不要普通的函数调用代价就可使之看起来像函数调用。宏的实现是用预处理器而不是编译器。
宏的缺陷
问题一:
表达式在宏内展开,所以它们的优先级不同于所期望的优先级。例如:

#define FLOOR(x,b) x>=b?0:1
if(FLOOR(a&0x0f,0x07))
宏将展开成:
if(a&0x0f>=0x07?0:1)

因为&的优先级比>=的低,所以宏的展开不是我们期望的结果。因此在定义宏时所有内容应该加上括号。
问题二:
宏和实际函数调用不一样。用宏定义,参数都要代进宏中。举例:

#define BAND(x)   (((x)>5&&(x)<10)?(x):0)
void main(){
......
cout<<BAND(++a)<<endl;
......

调用宏实际上是这样的:(((++a)>5&&(++a)<10)?(++a):0)
而不是直接将++a的具体值代入x.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值