C 使用但设置可变警告处理

C 使用但设置可变警告处理,c,gcc,gcc-warning,C,Gcc,Gcc Warning,我有以下代码,在使用gcc-4.6编译它时,我得到警告: 警告:变量“状态”已设置但未使用[-Wunused但已设置变量] 什么时候调试_ 没有设置标志,我收到警告。 有什么办法可以绕过这个警告吗?您可以用\ifdef子句围绕状态的变量声明 #ifdef _DEBUG_ status_t status #endif 编辑:您还必须环绕通话: #ifdef _DEBUG_ status = pthread_rwlock_unlock(&p_lock->lock);

我有以下代码,在使用gcc-4.6编译它时,我得到警告:

警告:变量“状态”已设置但未使用[-Wunused但已设置变量]

什么时候调试_ 没有设置标志,我收到警告。
有什么办法可以绕过这个警告吗?

您可以用
\ifdef
子句围绕
状态的变量声明

#ifdef _DEBUG_
    status_t status
#endif
编辑:您还必须环绕通话:

#ifdef _DEBUG_
    status = pthread_rwlock_unlock(&p_lock->lock);
#else
    pthread_rwlock_unlock(&p_lock->lock);
#endif

或者您可以关闭错误消息。

关闭未使用变量警告的编译器选项是
-Wno unused
。 要在更细粒度的级别上获得相同的效果,您可以这样使用:

int main()
{
  #pragma GCC diagnostic ignored "-Wunused-variable"
  int a;
  #pragma GCC diagnostic pop
  // -Wunused-variable is on again
  return 0;
}

当然,这是不可移植的,但您可以用于VS。

您可以将
断言
宏更改为:

#if defined (_DEBUG_)
#define ASSERT       assert
#else                           /* _DEBUG_ */
#define ASSERT( exp ) ((void)(exp))
#endif   

如果表达式没有副作用,那么它仍然应该被优化,但它也应该抑制警告(如果表达式确实有副作用,那么在调试和非调试构建中会得到不同的结果,这是您不希望的!)。

如果要这样做,那么您可以使用
\u属性(未使用))
声明上的注释。副作用是什么意思?@alnet:具有副作用的表达式是指改变某些内容的表达式,例如,
ASSERT(i++)
。我现在有一个相关的问题:)不幸的是,/usr/include/assert.h(至少在我的平台上)定义了
assert(exp)((void)0)
,这意味着
exp
被丢弃,您仍然会得到警告。
#if defined (_DEBUG_)
#define ASSERT       assert
#else                           /* _DEBUG_ */
#define ASSERT( exp ) ((void)(exp))
#endif