error: expected identifier or '(' before ')' token after changing a macro

error: expected identifier or '(' before ')' token after changing a macro

在 C 程序 (u-boot) 中,为了检查程序是否运行该宏,我更改了定义状态
来自

#define debug_cond(cond, fmt, args...)                  \
({                                  \
    if (cond)                           \
        log(LOG_CATEGORY,                   \
            (enum log_level_t)(LOGL_FORCE_DEBUG | _LOG_DEBUG),  \
            fmt, ##args);                   \
})

#define debug_cond(cond, fmt, args...)                  \
({                                  \
extern uint64_t myptr;              \
    if (cond) {                         \
        *((uint64_t *)myptr) = 0x801; myptr+=8; \ 
        log(LOG_CATEGORY,                   \
            (enum log_level_t)(LOGL_FORCE_DEBUG | _LOG_DEBUG),  \
            fmt, ##args);                   \
    }
})                 <==== line 267

并且编译给了我这个错误信息。

In file included from include/linux/printk.h:4,
                 from include/common.h:20,
                 from lib/asm-offsets.c:14:
include/log.h:267:1: error: expected identifier or '(' before '}' token
  267 | })
      | ^
include/log.h:267:2: error: expected identifier or '(' before ')' token
  267 | })

我不知道这里出了什么问题。谁能告诉我哪里做错了?

您在第 5 行宏的结尾 \ 之后有一个 space。删除尾随 space:

#define debug_cond(cond, fmt, args...)                  \
({                                  \
extern uint64_t myptr;              \
    if (cond) {                         \
        *((uint64_t *)myptr) = 0x801; myptr+=8; \
        log(LOG_CATEGORY,                   \
            (enum log_level_t)(LOGL_FORCE_DEBUG | _LOG_DEBUG),  \
            fmt, ##args);                   \
    }
})

space 将宏定义分成两半,编译器解释后半部分导致语法错误。

打开编辑器的“显示白色space 个字符”选项可能对长 运行.

很有帮助