之前一直对优先级有简单的认识,但是平时用的时候没有出现过什么问题,因为平时用的都是比较常规的运算符。
当运算符遇上宏定义爆发的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。。。