首页 > 解决方案 > 将函数转换为 void 是否是“旧式转换”?

问题描述

Coverity 抱怨我们代码库中的各种函数调用都没有检查返回值。

未检查的返回值 (CHECKED_RETURN)3。check_return:在不检查返回值的情况下调用 Append(就像其他地方 78 次中的 73 次所做的那样)。

void过去,我们可以通过将返回值转换为(如这里讨论的)来简单地解决这个问题(在仔细检查返回值是否真的不重要之后):

(void)Foo.Append(bar);

但是,我们正朝着启用所有警告的方向发展,并将警告视为错误,所以我有点担心上面的代码会生成old-style-cast诊断。如果是这种情况,我需要将我们的代码修改为更丑陋的格式:

static_cast<void>( Foo.Append(bar) );

但是,gccclang似乎都能够毫无怨言地编译这段代码(第一种形式)所以我想我的问题的最终形式是这样的:void就 C 风格的转换而言,将函数返回到视为规则的例外吗?还是我需要仔细检查我的代码,看看有问题的行是否实际上没有包含在这些构建中?

标签: c++castingsuppress-warnings

解决方案


没关系。

(void) f(x);

总是等价于 a static_castas per [expr.static.cast]/6

任何表达式都可以显式转换为 cv void 类型,在这种情况下,它变成了废弃值表达式。

将函数的结果转换为void使表达式成为丢弃值表达式的方法。现在,C++ 方式应该是static_cast<void>(...)but(void) ...是一个习惯用法(并且更短)。

由于后者定义明确并且在代码库中非常常见,因此 gcc 1和 clang 2使它触发Wold-style-cast

它定义明确,被主要编译器认可。没关系。


1) g++ 文档 --- 3.5 控制 C++ 方言的选项

-Wold-style-cast(仅限 C++ 和 Objective-C++)如果在 C++ 程序中使用
旧样式(C 样式)强制转换为非 void类型,则发出警告。新风格的演员表 ( dynamic_cast, static_cast, reinterpret_cast, 和const_cast) 不太容易受到意外影响,并且更容易搜索。

2) 没有记录


推荐阅读