GCC 6.3 警告常量“0”与布尔表达式的比较始终为假

GCC 6.3 warning comparison of constant '0' with Boolean expression is always false

交战指向这段代码

#define DO_SAFE(do_work, goto_error)                \
 DO_IF(unlikely((do_work) < 0), goto_error)

这是来自头文件。我不明白这段代码试图做什么,或者比较。对我来说似乎是 do_work if false then goto error。但如果那是正确的,那会是

 (do_work != 0) 

但这只是猜测。

如果需要更多信息,请告知。

c 文件中的函数给出错误

for (page_num = 0; page_num < PAGE_MAX_NUM; page_num++) {
    DO_SAFE(touch_i2c_write_byte(client, PAGE_SELECT_REG, page_num), error);

for (u_address = DESCRIPTION_TABLE_START; u_address > 10; u_address -= sizeof(struct function_descriptor)) 
{
DO_SAFE(touch_i2c_read(client, u_address, sizeof(buffer), (unsigned char *)&buffer) < 0, error);

哦,我看到问题了(如果我水平滚动——线条相当长):

DO_SAFE(touch_i2c_read(client, u_address, sizeof(buffer), (unsigned char *)&buffer) < 0, error);

您正在宏调用中测试 < 0 条件,这意味着您最终会扩展 DO_SAFE 执行以下操作:

if ((touch_i2c_read(…) < 0) < 0)

并且内部条件的结果永远不会小于零。

使用:

DO_SAFE(touch_i2c_read(client, u_address, sizeof(buffer), (unsigned char *)&buffer), error);

(这已经消除了直接调用 DO_SAFE 中的 < 0,留下宏来测试 < 0。)