在发布版本中使用 assert() 时避免未使用的变量警告

新手上路,请多包涵

有时,局部变量仅用于在 assert() 中检查它,就像这样 -

 int Result = Func();
assert( Result == 1 );

在 Release 构建中编译代码时,assert()s 通常被禁用,因此此代码可能会产生关于 Result 已设置但从未读取的警告。

一个可能的解决方法是 -

 int Result = Func();
if ( Result == 1 )
{
    assert( 0 );
}

但是它需要太多的输入,看起来并不容易,并且会导致总是检查条件(是的,编译器可能会优化检查,但仍然如此)。

我正在寻找一种替代方式来表达这个assert(),这种方式不会引起警告,但仍然易于使用并避免改变assert() 的语义。

(在此代码区域中使用#pragma 禁用警告不是一种选择,降低警告级别以使其消失也不是一种选择……)。

原文由 Hexagon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 792
2 个回答

我们使用宏来明确指示何时未使用某些内容:

 #define _unused(x) ((void)(x))

然后在您的示例中,您将拥有:

 int Result = Func();
assert( Result == 1 );
_unused( Result ); // make production build happy

这样(a)生产构建成功,并且(b)在代码中很明显该变量是 设计 未使用的,而不是只是被遗忘了。这在不使用函数的参数时特别有用。

原文由 Graeme Perrow 发布,翻译遵循 CC BY-SA 3.0 许可协议

您应该在返回值之前移动函数内部的断言。您知道返回值不是未引用的局部变量。

另外,无论如何,在函数内部更有意义,因为它创建了一个自包含单元,该单元具有其 OWN 前置和后置条件。

很有可能,如果函数返回一个值,那么无论如何您都应该在发布模式下对该返回值进行某种错误检查。所以它不应该是一个未引用的变量。

编辑,但在这种情况下,后置条件应该是 X(见评论):

我强烈不同意这一点,应该能够从输入参数中确定后置条件,如果它是成员函数,则可以确定任何对象状态。如果一个全局变量修改了函数的输出,那么函数应该被重构。

原文由 Brian R. Bondy 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题