假设我有一个函数
void myFun(int*)
在C ++中,以下是什么意思
( void(*)(void*) )&myFun
它是一个指向函数的指针,该函数将(void*)
作为参数并返回void
吗?允许这种类型的演员吗?
答案 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
的情况。