在函数调用之前使用(void)
可能重复:
将未使用的返回值转换为void
例如,在函数调用之前(void)
的目的是什么
(void)func1();
我假设这与简单地调用func1();
因此(void)
调用只是为了让其他程序员知道返回类型将被忽略,例如,如果func1()
的返回类型为int
,或者编译器是否可能对函数执行某些优化? 也许完全背后有另一个原因 – 它甚至是合法的C ++,或者它可能是某些遗留代码中看到的C的残余。
谢谢
转换为void可以在一种情况下具有语义效果:其中值是逗号运算符的操作数并覆盖逗号运算符,转换为void将禁止它:
struct S { int operator,(int) { return 0; } }; std::cout << (S(), 42) << '\n'; // prints '0' std::cout << ((void) S(), 42) << '\n'; // prints '42'
如果使用属性声明某些函数,它会阻止警告:“如果未使用/检查返回值,则发出警告”
也许是警告的重复:忽略’scanf’的返回值,使用属性warn_unused_result声明
查看gcc的文档: http ://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html(warn_unused_result)了解更多详情
这意味着很少。 它明确地将该行转换为void表达式,这是一个仅用于其副作用且其值被丢弃的表达式。 这样的台词
func1();
和
(void)func1();
会做同样的事情。 如果编译器知道未使用表达式的值,则可能会执行一些优化,但编译器很可能使用或不使用explicit(void)来计算它。
它可以用作文档的一种forms,程序员试图明确表示他们没有使用表达式的值。
另一个奇怪的用途是允许将未知返回类型的函数作为序列运算符与运算符相邻使用。 即, decltype( f(), g() )
技术,你想说“ f
可以用with ()
,就像g
,我希望这个类型是g()
返回的类型”。 但是,如果f()
返回一个类型,使得operator,
重载,结果将是意外的。
所以你做了decltype( void(f()), g() )
,并在调用operator,
之前丢弃了f()
的返回值,因此你可以保证得到内置的序列运算符而不是某些未知的覆盖类型。