C语言宏展开之后计算值的问题

本文探讨了C/C++宏定义中运算符优先级的问题,特别是当宏参数参与表达式计算时,如何避免因宏展开导致的错误。通过实例说明了正确的宏定义方式,强调了在宏定义中合理使用括号的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

宏定义展开的区别

#define FILE_OAD_NUM_LEN	2
#define FILE_PER_OAD_FIX_DAT_LEN	512 //每个OAD的固定长度

//如下两种方式定义,展开之后计算的值正确
#define FILE_PER_OAD_BASE_OFFSET(OAD_NUM)	(FILE_OAD_NUM_LEN + FILE_PER_OAD_FIX_DAT_LEN*OAD_NUM)
#define FILE_PER_OAD_BASE_OFFSET(OAD_NUM)	(FILE_PER_OAD_FIX_DAT_LEN*OAD_NUM + FILE_OAD_NUM_LEN)

//如下两种方式定义,展开之后计算的值不正确
#define FILE_PER_OAD_BASE_OFFSET(OAD_NUM)	(OAD_NUM*FILE_PER_OAD_FIX_DAT_LEN + FILE_OAD_NUM_LEN)
#define FILE_PER_OAD_BASE_OFFSET(OAD_NUM)	(FILE_OAD_NUM_LEN + OAD_NUM*FILE_PER_OAD_FIX_DAT_LEN)

 

其实上面的写法本身没有问题,只是我在调试的时候,发现调整前后顺序结果就不一样,以为是这个问题导致,其实不然,我翻车了!!!在实际使用时却会有问题,如

int iOffset;
WORD wOadNum;

//方式1:计算出错了
FILE_PER_OAD_BASE_OFFSET(wOadNum-1);

//方式2:计算正确
iOffset = wOadNum - 1;
FILE_PER_OAD_BASE_OFFSET(iOffset );

原因是宏展开时,
方式1为:
FILE_OAD_NUM_LEN + (FILE_PER_OAD_FIX_DAT_LEN*OAD_NUM-1)

方式2为:
FILE_OAD_NUM_LEN + (FILE_PER_OAD_FIX_DAT_LEN*iOffset )

到这里,问题出现了吧,是由于宏内部的传入参数没有加括号,即宏定义需改为如下

#define FILE_PER_OAD_BASE_OFFSET(OAD_NUM)    (FILE_OAD_NUM_LEN + (FILE_PER_OAD_FIX_DAT_LEN*(OAD_NUM)))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值