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

时间:2012-04-05 03:19:24

标签: c macros

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

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

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

#define trace(x) 0

#define trace(x) (void)0

使错误无声。我的问题是:为什么?有什么区别?

2 个答案:

答案 0 :(得分:8)

强制转换为清楚表明程序员打算抛弃结果。警告的目的是表明声明没有明显效果,因此如果它是无意的,则提醒程序员这是有用的。这里的警告没有用处。

答案 1 :(得分:7)

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

#define NOP do { } while(0)

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

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