为什么(void)0停止"语句无效"警告?

blu*_*ift 9 c macros

我有一个trace()宏我用另一个宏打开和关闭,例如

#ifdef TRACE
    #define trace(x) trace_val(x, 0)
#else
    #define trace(x) 0
#endif
Run Code Online (Sandbox Code Playgroud)

warning: statement with no effect当我trace()TRACEundefined 调用时,这是从gcc 生成的.经过一番搜索,我发现了变化

#define trace(x) 0
Run Code Online (Sandbox Code Playgroud)

#define trace(x) (void)0
Run Code Online (Sandbox Code Playgroud)

沉默错误.我的问题是:为什么?有什么不同?

Dav*_*rtz 8

转换为void表明程序员打算抛弃结果.警告的目的是表明声明没有明显效果,因此如果它是无意的,则提醒程序员注意这一点是有用的.这里的警告没有任何意义.


Nik*_* B. 7

警告和解决方法是特定于编译器的.你可以做的是以下内容:

#define NOP do { } while(0)

#ifdef ENABLE_TRACE
    #define TRACE(x) trace_val(x, 0)
#else
    #define TRACE(x) NOP
#endif
Run Code Online (Sandbox Code Playgroud)

这首先避免了潜在的问题.