可能是重复问题:
如何将未使用的返回值转换为void
在函数调用前加上(void)
的目的是什么,例如:
(void)func1();
我认为这与直接调用func1();
相同。
因此,(void)
调用是否只是为了让其他程序员知道返回类型将被忽略,例如如果func1()
的返回类型为int
,还是编译器可能对函数进行一些优化?也许有其他原因 - 它是否合法的C ++代码,或者它是否是在某些遗留代码中看到的C的残留物。
谢谢
可能是重复问题:
如何将未使用的返回值转换为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'
如果某些函数被声明为带有属性:"警告,如果未使用/检查返回值",则可以避免警告。
可能是忽略'return value'的警告:已声明具有warn_unused_result属性的重复问题。
请查阅gcc文档:http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html(warn_unused_result)以获得更多详情。
printf
的返回结果是什么时候? :-) - Kerrek SBprintf
函数。 - Christian Rauprintf(...)
和(void) printf(...)
之间的差异,其他工具如lint也会。请注意:我并不提倡这种做法。 - David Hammenscanf
返回的结果是什么时候?另外,如果printf的返回值不是如此无用的信息,人们实际上会检查它。这是一个非常奇怪的函数。 - Lundin这句话实际上没有什么意义。它明确将该行转换为一个空表达式,即仅用于其副作用且其值被丢弃的表达式。因此,这些代码行:
func1();
并且
(void)func1();
这将执行相同的操作。如果编译器知道表达式的值未被使用,则可以执行一些优化,但很可能编译器可以在有或没有显式(void)的情况下找出它。
它可以用作文档形式,程序员试图让它明显地表明他们没有使用表达式的值。
decltype(f(), g())
技术,其中您想要说“f
可以使用 ()
进行操作,同样可以使用 g
,并且我希望该类型是 g()
返回的类型”。但是,如果 f()
返回的类型使得 operator,
被重载,则结果将是意外的。decltype(void(f()), g())
,在调用 operator,
之前丢弃 f()
的返回值,这样您就保证会得到内置的序列运算符而不是某个未知的覆盖类型。
(void) printf("hello");
吗? - effeffescanf("%d", &x)
吗?或者你在生产代码中没有使用scanf... - Lundin