繁体   English   中英

强制转换函数指针

[英]Cast a function pointer

假设我有一个功能

void myFun(int*) 
在C ++中,以下是什么意思

 ( void(*)(void*) )&myFun 

它是一个指向函数的指针,它将(void*)作为参数并返回一个void吗? 允许这种类型的演员吗?

就目前而言,我很确定这是不允许的。

如果你删除初始void周围的parens得到:

void (*)(void *)

...然后是的,它是一个指向函数的指针,该函数返回void并将指向void的指针作为唯一的参数。 要转换为该类型,您需要在括号中包含该类型的整个名称,因此您将得到: (void (*)(void *)) ,您将跟随被转换的值,以获得:

(void (*)(void *))&myFun;

至少如果内存服务,是的,这是允许的,虽然通过结果取消引用指针(即,试图调用它指向的函数)可能会给出未定义的行为。 特别是,当/如果你调用函数时,它期望一个指向int的指针,并且(可能)将它指向的任何东西用作int。 但是,如果它指出的内容没有正确对齐以用作int,则它不太可能按预期工作。

演员是允许的,见5.2.10(6):

函数指针可以显式转换为不同类型的函数指针。 通过指向函数类型(8.3.5)的函数调用函数的效果与函数定义中使用的类型不同。 除了将“指向T1的指针”类型的prvalue转换为“指向T2的指针”类型(其中T1和T2是函数类型)并返回其原始类型产生原始指针值,这种指针转换的结果是未指定的。

这相当于C 6.3.2.3(8):

指向一种类型的函数的指针可以被转换为指向另一种类型的函数的指针并且再次返回; 结果应该等于原始指针。 如果转换的指针用于调用类型与指向类型不兼容的函数,则行为未定义。

实际上,通过具有不同但兼容的参数类型(尤其是指针类型)的函数指针调用通常会成功,并且对参数具有C样式强制转换的效果。 但是,这绝不是保证; https://stackoverflow.com/a/189126/567292讨论了gcc决定使这种未定义函数指针转换调用abort

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM