我有一个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
使错误无声。我的问题是:为什么?有什么区别?
答案 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
这首先避免了潜在的问题。