GCC中的断言和未使用的局部变量警告不能很好地混合?

时间:2011-04-11 19:27:05

标签: c++ c gcc g++

我在GCC中遇到了未使用的局部变量警告问题。

通常我的代码看起来像这样:

bool success = foo();
assert(success);

这适用于调试版本。然而,在发布中,断言编译为空,GCC给了我一个警告。

解决此问题的最佳方法是什么?用#ifdef包装bool success =似乎不是一个很好的解决方案......

7 个答案:

答案 0 :(得分:8)

我可能会定义一个特定于此场景的宏

#ifndef NDEBUG
#define verify(expression) assert(expression)
#else
#define verify(expression) expression
#endif

我更喜欢这种方法而不是使用局部变量,因为它不会使用仅有条件存在的值污染方法。

总的来说,我发现在我的项目中有两组宏非常有用

  • assertXXX:仅调试执行
  • verifyXXX:零售+调试执行

答案 1 :(得分:8)

我使用宏

#define UNUSED(x) ((void)(x))

像这样使用:

UNUSED(success);

宏使警告静音并记录变量未使用的事实(至少在某些版本中)是故意的/确定。

答案 2 :(得分:6)

不了解GCC,但这在Microsoft Visual C ++中一直有效:

(void) success;

它引用变量而不实际执行任何操作。

答案 3 :(得分:1)

您可以使用variable attribute将其标记为可能未使用。

答案 4 :(得分:1)

您可以使用NDEBUG宏,该宏在未使用断言时定义,例如:

#ifndef NDEBUG
  bool success =
#endif
    foo();
  assert(success);

编辑:这将有效地“杀死”警告,因为#ifndef将确保没有变量可以警告。

答案 5 :(得分:1)

这是一个稍微简洁的形式Lindydancer的solution,代价是定义一个帮助宏。这是辅助宏:

#ifndef NDEBUG
#  define DEBUG_ONLY( ... ) __VA_ARGS__
#else
#  define DEBUG_ONLY( ... )
#endif

然后就可以这样使用:

DEBUG_ONLY( bool success = ) foo();
assert( success );

答案 6 :(得分:0)

您可以使用特定于GCC的unused属性。它通常被定义为一个简短的形式,很容易从非GCC编译器的代码中删除。