说,像这样:
int SayHelloThenReturnTen(void) {
puts("Hello world");
return 10;
}
然后再:
((void(*)(void))SayHelloThenReturnTen)();
这样安全吗?通过强制转换为void指针“破坏”返回值是否安全?这是安全的跨平台平台,还是这种不确定的行为?
这样安全吗?
将函数指针强制转换为任何函数指针类型都是安全的。将结果强制转换回原始类型将产生一个等于原始指针的指针值。
它是不是安全的,但是,要调用通过类型与它所指向的功能不兼容的函数指针的函数。该标准的第6.3.2.3/8段明确规定了这一点:
可以将指向一种类型的函数的指针转换为指向另一种类型的函数的指针,然后再次返回。结果应等于原始指针。如果使用转换后的指针来调用其类型与引用的类型不兼容的函数,则该行为是不确定的。
(添加了强调)
通过强制转换为void指针“破坏”返回值是否安全?
您的示例并未证明这一点。相反,它演示了使用void
返回类型转换为函数指针类型。再次,演员表还可以,但调用不行。
这是安全的跨平台平台,还是这种不确定的行为?
这是不安全的,并且具有未定义的行为。而且,绝对没有任何好处。您可以根据需要简单地忽略该函数的返回值。如果您要尝试使编译器警告静音,那么,
如果你想传达给编译器,你真的要忽略的返回值,那么它是更清晰,更简单,安全地投是对无效:
(void) SayHelloThenReturnTen();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句