正确使用ifdef进行自定义调试

dai*_*isy 1 c linux

仅当它是调试版本时,我才尝试打印消息。所以我写了下面的代码:

#ifdef MY_DEBUG
#define dbg_printf fprintf
#else
#define dbg_printf
#endif

dbg_printf(stderr, "item: %s\n", config[i]);
Run Code Online (Sandbox Code Playgroud)

当未定义 MY_DEBUG 时,我收到以下消息:

main.c:xxx:xxx: warning: left-hand operand of comma expression has no effect [-Wunused-value]
             dbg_printf(stderr, "item: %s\n", config[i]);
Run Code Online (Sandbox Code Playgroud)

我试图避免该消息,但我应该添加-Wunused-value到 CFLAGS 吗?最佳做法是什么?

Que*_*tin 6

您的宏在扩展为空时会留下参数列表,该列表将成为一个搁浅的逗号表达式。通常的解决方案是在宏中匹配并转发参数列表,并在禁用时将其全部替换为 noop 语句。

#ifdef MY_DEBUG
#define dbg_printf(...) fprintf(__VA_ARGS__)
#else
#define dbg_printf(...) (0)
#endif

Run Code Online (Sandbox Code Playgroud)