9

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

#ifdef TRACE
    #define trace(x) trace_val(x, 0)
#else
    #define trace(x) 0
#endif

当我使用undefinedwarning: statement with no effect调用时,这会从 gcc生成。经过一番搜索,我发现改变了trace()TRACE

#define trace(x) 0

#define trace(x) (void)0

使错误静音。我的问题是:为什么?有什么不同?

4

2 回答 2

8

强制转换为 void 清楚地表明程序员打算将结果丢弃。警告的目的是表明该语句没有效果并不明显,因此提醒程序员注意这一点是有用的,以防它是无意的。这里的警告没有任何意义。

于 2012-04-05T03:22:45.310 回答
7

警告和解决方法是特定于编译器的。但是,您可以执行以下操作:

#define NOP do { } while(0)

#ifdef ENABLE_TRACE
    #define TRACE(x) trace_val(x, 0)
#else
    #define TRACE(x) NOP
#endif

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

于 2012-04-05T03:22:59.647 回答