int fn();
void whatever()
{
(void) fn();
}
是否有任何理由将未使用的返回值转换为无效,或者我是否认为这完全是浪费时间?
跟进:
那看起来非常全面。我认为这比评论未使用的返回值更好,因为自我记录代码比评论更好。就个人而言,我会关掉这些警告,因为这是不必要的噪音。
如果因为它而逃脱了,我会吃掉我的话......
答案 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等自动工具将不允许您调用具有返回类型的函数而不返回值,除非您明确地将返回值强制转换为(空隙)