强制转换函数指针

时间:2012-06-28 00:22:46

标签: c++

假设我有一个函数

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


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

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

2 个答案:

答案 0 :(得分:5)

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

如果您删除初始void周围的parens,则获取:

void (*)(void *)

...然后是的,它是一个指向函数的指针,该函数返回void并将指向void的指针作为唯一的参数。要转换为该类型,您需要将该类型的整个名称括在括号中,这样您就可以得到:(void (*)(void *)),您可以按照正在投射的值来执行:

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

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

答案 1 :(得分:3)

施行是允许的,见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的情况。