当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么将未使用的返回值转换为void?》经验,为你挑选了4个好方法。

大卫的答案几乎涵盖了这一点的动机,明确地向其他"开发人员"表明你知道这个函数会返回,但是你明确地忽略了它.

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

我认为对于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.

有点偏离主题,但为什么你会做"a + a;" 那样没有使用返回值?这似乎是对我的滥用副作用,并混淆了代码的意图. (6认同)

那么,你每天使用的那个将是'a = a'.这将返回分配给对象(对于所有表现良好的类,即!:)).另一个例子是:os <<"Hello World"<< std :: endl.它们中的每一个都返回"os"对象. (3认同)


David Holm.. 44

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

static_cast(fn());

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



1> Richard Cord..:

大卫的答案几乎涵盖了这一点的动机,明确地向其他"开发人员"表明你知道这个函数会返回,但是你明确地忽略了它.

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

我认为对于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.


有点偏离主题,但为什么你会做"a + a;" 那样没有使用返回值?这似乎是对我的滥用副作用,并混淆了代码的意图.
那么,你每天使用的那个将是'a = a'.这将返回分配给对象(对于所有表现良好的类,即!:)).另一个例子是:os <<"Hello World"<< std :: endl.它们中的每一个都返回"os"对象.

2> David Holm..:

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

static_cast(fn());

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


我使用g ++,即使有这样的演员也会发出警告.

3> Daniel Earwi..:

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

它分析代码以查找可能的问题并发出警告和建议.如果某个函数返回了一个未经检查过的值,lint则会发出警告,以防这是偶然的.要lint对此警告保持沉默,请将呼叫转为(void).


GCC用-Wall给出了警告.
它可能是以这种方式开始的,但现在大多数工具都有其他机制来抑制这样的警告.此外 - 无论为何开始,特别是在安全关键代码领域内,这已成为"记录"开发人员意图的常用方法.

4> Nawaz..:

Casting to void用于抑制未使用变量和未保存返回值或表达式的编译器警告.

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

可以将任何表达式显式转换为"cv void"类型.表达式值将被丢弃.

所以你可以写:

//suppressing unused variable warnings
static_cast(unusedVar);
static_cast(unusedVar);
static_cast(unusedVar);

//suppressing return value warnings
static_cast(fn());
static_cast(fn());
static_cast(fn());

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

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

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

它也没关系.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有