在函数调用之前使用(void)

时间:2012-12-19 14:28:51

标签: c++ c

  

可能重复:
  casting unused return values to void

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

(void)func1();

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

相同

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

由于

3 个答案:

答案 0 :(得分:24)

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

可能是Warning: ignoring return value of 'scanf', declared with attribute warn_unused_result

的副本

查看gcc:http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html(warn_unused_result)的文档以获取更多详细信息

答案 1 :(得分:4)

这意味着很少。它明确地将该行转换为void表达式,该表达式仅用于其副作用并且其值被丢弃。所以行

func1();

(void)func1();

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

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

答案 2 :(得分:3)

另一个奇怪的用途是允许将未知返回类型的函数作为序列运算符与,运算符相邻使用。也就是decltype( f(), g() )技术,您想说“f可以使用()进行操作,g可以使用g(),我希望此类型是f() {1}}返回“。但是,如果operator,返回的类型导致decltype( void(f()), g() )重载,则结果将是意外的。

所以你做f(),并在调用operator,之前丢弃{{1}}的返回值,因此你可以保证得到内置的序列运算符而不是某些未知的覆盖类型。