Coverity抱怨我们的代码库中的各种函数调用都没有检查返回值。
未经检查的返回值(CHECKED_RETURN)3。 check_return:通话追加 无需检查返回值(就像在其他地方所做的一样,在78中占73 次)。
过去,通过将返回值转换为void
(如讨论的here),我们可以简单地解决此问题(在仔细检查返回值确实不重要之后):>
(void)Foo.Append(bar);
但是,我们正朝着启用所有警告的方向前进,和将警告视为错误,因此我有点担心上面的代码将生成old-style-cast
诊断。如果是这样,我将需要将我们的代码修改为难看的格式:
static_cast<void>( Foo.Append(bar) );
但是, gcc 和 clang 似乎都能够编译此代码( first 表单)而不会抱怨。因此,我想我的问题的最终形式是:就C样式转换而言,将函数强制转换为void
是否被视为规则的例外?还是我需要仔细检查我的代码,看看所涉及的行是否实际上未包含在这些版本中?
答案 0 :(得分:7)
很好。
(void) f(x);
根据[expr.static.cast]/6
始终等于static_cast
:
任何表达式都可以显式转换为cv void类型,在这种情况下,它将成为一个废弃值表达式。
将函数的结果转换为void
是 使表达式为discard-value-expression的方式。现在,C ++方式应该是static_cast<void>(...)
,但是(void) ...
是一个习惯用法(并且更短)。
由于后者定义明确且在代码库中确实很常见,因此gcc 1 和clang 2 使其成为 not 触发器{{1} }。
定义明确,被主要编译器认可。很好。
1) g++ documentation --- 3.5 Options Controlling C++ Dialect
Wold-style-cast
(仅限C ++和Objective-C ++)
如果在C ++程序中使用了旧样式(C样式)强制转换为非空类型,则发出警告。新型强制类型转换(-Wold-style-cast
,dynamic_cast
,static_cast
和reinterpret_cast
不太容易受到意想不到的影响,并且更易于搜索。