宏三元逗号表达式用作语句时会导致警告

Macro ternary comma expression causes warning when used as a statement

我定义了一个宏来记录 NULL 指针。因为我的代码中有 NULL 检查,所以宏是一个三元组,它总是 returns 参数并在它为 NULL 时调用一个函数。

然而,如果在 if 语句之外使用宏,则会导致编译警告 (gcc: right-hand operand of comma expression has no effect)。 奇怪的是,即使使用 -Weverything,clang 也不会发出警告。

到目前为止,我提出的解决方案是定义另一个宏,将表达式包装在没有正文的 if 中。

#define NULLPRINT(X)                        \
    ((X) ? (X)                              \
     : (fprintf(stderr,                     \
                "%s:%u: %s: %s is NULL.\n", \
                __FILE__,                   \
                __LINE__,                   \
                __func__,                   \
                #X),                        \
        stacktrace(),                    \
        (X)))

#define IF_NULLPRINT(X) do {if(NULLPRINT(X)){}} while(0)

有没有办法在不重复宏并且避免编译器警告的情况下做到这一点? 显然没有关闭警告。

尝试将其转换为 void:

(void) NULLPRINT(...);

这通常会抑制有关未使用的表达式值的警告。

您可以定义另一个宏来隐藏它。