为什么将未使用的返回值转换为void?

时间:2009-03-27 13:00:59

标签: c++ c void

int fn();

void whatever()
{
    (void) fn();
}

是否有任何理由将未使用的返回值转换为无效,或者我是否认为这完全是浪费时间?

跟进:

那看起来非常全面。我认为这比评论未使用的返回值更好,因为自我记录代码比评论更好。就个人而言,我会关掉这些警告,因为这是不必要的噪音。

如果因为它而逃脱了,我会吃掉我的话......

9 个答案:

答案 0 :(得分:71)

大卫的answer几乎涵盖了这个动机,明确地向其他“开发者”表明你知道这个函数会返回,但是你明确地忽略了它。

这是一种确保始终处理必要的错误代码的方法。

我认为对于C ++而言,这可能是我更喜欢使用C风格的演员表的唯一地方,因为使用完整的静态演员表示法在这里感觉有些过分。最后,如果您正在审查编码标准或编写一个编码标准,那么明确声明对重载运算符(不使用函数调用表示法)的调用也应该免除这一点也是一个好主意:

class A {};
A operator+(A const &, A const &);

int main () {
  A a;
  a + a;                 // Not a problem
  (void)operator+(a,a);  // Using function call notation - so add the cast.

答案 1 :(得分:43)

在工作中我们使用它来确认该函数具有返回值,但开发人员断言忽略它是安全的。由于您将问题标记为C ++,因此您应该使用 static_cast

static_cast<void>(fn());

就编译器而言,将返回值转换为void几乎没有意义。

答案 2 :(得分:35)

这样做的真正原因可以追溯到C代码上使用的工具,称为lint

它分析代码,查找可能出现的问题并发出警告和建议。如果函数返回了一个未被检查的值,lint会发出警告,以防这是偶然的。要对此警告进行lint静音,请将呼叫转为(void)

答案 3 :(得分:22)

转换为void用于禁止编译器警告未使用的变量和未保存的返回值或表达式。

标准(2003)在§5.2.9/ 4中说,

  

任何表达式都可以显式转换为“cv void”类型。表达式值被丢弃

所以你可以写:

//suppressing unused variable warnings
static_cast<void>(unusedVar);
static_cast<const void>(unusedVar);
static_cast<volatile void>(unusedVar);

//suppressing return value warnings
static_cast<void>(fn());
static_cast<const void>(fn());
static_cast<volatile void>(fn());

//suppressing unsaved expressions
static_cast<void>(a + b * 10);
static_cast<const void>( x &&y || z);
static_cast<volatile void>( m | n + fn());

所有表格均有效。我通常把它缩短为:

//suppressing  expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);

它还可以。

答案 4 :(得分:4)

对于你的程序功能,转换为void是没有意义的。我也会争辩说,你不应该用它来向正在阅读代码的人发出信号,正如David的回答中所建议的那样。如果您想要传达有关您的意图的信息,最好使用评论。添加这样的演员只会看起来很奇怪,并提出有关可能原因的问题。只是我的意见......

答案 5 :(得分:4)

我知道这是一个旧线程,但是语言不断发展,为了完整起见,在这里应该提到,自c ++ 17起,我们有了[[maybe_unused]]属性,可以使用它代替void投。

答案 6 :(得分:3)

施展无效是无成本的。它只是编译器如何处理它的信息。

答案 7 :(得分:3)

在C中,完全可以选择无效。事实上,任何人都会理解声明的意图。

在C ++中,您可以使用其他工具。由于C演员通常不受欢迎,并且因为明确的演员到虚空可能会让你的同事感到惊讶(这让我很惊讶),我在某个地方有这个功能模板

template <typename T>
void use_expression(const T&) {}

我用

...
use_expression(foo());

我会在C中写(void)foo()

答案 8 :(得分:1)

此外,当验证您的代码符合MISTA(或其他)标准时,LDRA等自动工具将不允许您调用具有返回类型的函数而不返回值,除非您明确地将返回值强制转换为(空隙)