关于宏定义遇上运算符优先级出现的问题

之前一直对优先级有简单的认识,但是平时用的时候没有出现过什么问题,因为平时用的都是比较常规的运算符。

当运算符遇上宏定义爆发的BUG,简单粗暴,先贴上代码片段

#define DATA_RX_MAX_NUM (82)
                                                                             
#define DATA_RX_BUFF_MAX_NUM     (((((DATA_RX_MAX_NUM) / (8)) + (1)) < 8) ? (8) : (((DATA_RX_MAX_NUM) / (8)) + (1)))

#define DATA_RX_TIMEOUT_LEN       DATA_RX_BUFF_MAX_NUM

void xxx_handler(int id,vector<uint8_t>& data)
{
    int rxDatalen = data.size()
    if(rxDatalen > DATA_RX_BUFF_MAX_NUM)
    {
        printf("error: recv data more than max\n");
    }else
    {
        printf("recved data\n")
        xxxx_handler();
    }
        
}

上面这段代码,当时的逻辑还是比较清楚,定义一个最大的DATA_RX_BUFF_MAX_NUM宏,用于能够动态的根据DATA_RX_MAX_NUM大小申请对应的内存数组

#define DATA_RX_BUFF_MAX_NUM ((((DATA_RX_MAX_NUM) / (8)) + (1)) < 8) ? (8) : (((DATA_RX_MAX_NUM) / (8)) + (1))

判断((((DATA_RX_MAX_NUM) / (8)) + (1)) < 8) 如果小于8就申请最最小的8字节,否则根据DATA_RX_MAX_NUM的大小申请对应的字节

结果实际跑的时候,出现一直是走到printf(“error: recv data more than max\n”); =====>这TM是什么玩意。。。。

怀疑人生的加了打印,打印DATA_RX_BUFF_MAX_NUM的值,一看是11 。。。 难道if(11 > 11)变成true了? FUCK!!!

后面不对,这种逻辑计算机不可能跑错,后面不得不原始操作,拆代码

#define DATA_RX_BUFF_MAX_NUM     ((((DATA_RX_MAX_NUM) / (8)) + (1)) < 8) ? (8) : (((DATA_RX_MAX_NUM) / (8)) + (1))
// (((10 + (1)) < 8)) ? (8) : ((11) + (1)) ==> (11 < 8) ? (8) :(11) 

一看没问题啊,这里不是取11吗

接下来继续

if(rxDatalen > DATA_RX_BUFF_MAX_NUM)
// 拆开后
if(11 > (11 < 8) ? (8) : (11) )
// 这里发现是忽略运算符的问题了 '?' > '>'
// 先算 11 < 8 ==> 0
if(11 > (0) ? (8) : (11)) 

这里结果就出来了,条件语句就是取得8,永远>0为真,所以一直输出printf(“error: recv data more than max\n”).如果单纯的是引用宏定义这个值是没问题,但是遇到和我这里一样,要进行运算符比较,就出问题了。所以只需要再加一层括号(((((DATA_RX_MAX_NUM) / (8)) + (1)) < 8) ? (8) : (((DATA_RX_MAX_NUM) / (8)) + (1))) 结束。。。。最后祝大家永远没有BUG。。。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值