宏三元逗号表达式用作语句时会导致警告
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(...);
这通常会抑制有关未使用的表达式值的警告。
您可以定义另一个宏来隐藏它。
我定义了一个宏来记录 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(...);
这通常会抑制有关未使用的表达式值的警告。
您可以定义另一个宏来隐藏它。