34

可能重复:
将未使用的返回值转换为 void

(void)例如,函数调用之前的目的是什么

(void)func1();

我认为这与简单地调用相同func1();

因此,(void)调用只是为了让其他程序员知道返回类型将被忽略,例如func1()返回类型是否为int,或者编译器是否可能对函数执行一些优化?也许它背后还有另一个原因——它甚至是合法的 C++,还是它是在某些遗留代码中看到的 C 的残余。

谢谢

4

4 回答 4

25

如果使用属性声明某些函数,它可以防止警告:“如果返回值未使用/检查则警告”

可能是警告的副本:忽略“scanf”的返回值,用属性 warn_unused_result 声明

查看 gcc 的文档:http ://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html (warn_unused_result) 了解更多详情

于 2012-12-19T14:30:39.360 回答
23

在一种情况下,强制转换为 void 可以产生语义效果:如果值是逗号运算符的操作数并覆盖逗号运算符,则强制转换为 void 将抑制它:

struct S {
  int operator,(int) { return 0; }
};
std::cout << (S(), 42) << '\n';           // prints '0'
std::cout << ((void) S(), 42) << '\n';    // prints '42'
于 2012-12-19T14:38:21.830 回答
5

这意味着很少。它显式地将行转换为 void 表达式,这是一个仅用于其副作用并且其值被丢弃的表达式。所以线条

func1();

(void)func1();

会做同样的事情。如果编译器知道未使用表达式的值,则可以执行一些优化,但编译器很可能可以在有或没有显式 (void) 的情况下计算出来。

它可以用作一种文档形式,程序员试图表明他们没有使用表达式的值。

于 2012-12-19T14:32:13.893 回答
3

另一个奇怪的用途是允许将未知返回类型的函数,作为序列运算符与运算符相邻使用。即,decltype( f(), g() )技术,您想说“f可以使用(), as can进行操作g,并且我希望这种类型成为g()返回的类型”。但是,如果f()返回一个operator,重载的类型,结果将是意料之外的。

所以你这样做,并在调用之前decltype( void(f()), g() )丢弃返回值,这样你就可以保证获得内置的序列运算符而不是一些未知的覆盖类型。f()operator,

于 2012-12-19T14:45:06.003 回答