我有错误
从'void *'到'void()的无效转换(void,u_int8_t *,u_int8_t *,u_int16_t,void *){aka void()(void,unsigned char *,unsigned char *,short unsigned int,void *) ''[-fpermissive]
void m_callback_friendrequest(Messenger *m, void (*function)(Messenger *m, u_int8_t *, u_int8_t *, u_int16_t, void *), void *userdata)
{
void (*handle_friendrequest)(void *, u_int8_t *, u_int8_t *, u_int16_t, void *) = (void *)(function);//->error
callback_friendrequest(&(m->fr), handle_friendrequest, m, userdata);
}
4 回答
在C中我认为你的代码可以工作,但C不会让你隐式地将
void*
转换为其他指针类型 . 我会做指针
handle_friendrequest
有类型指针
function
有类型这是两种不同的函数指针类型,它们彼此完全不兼容 . 您不能使用
function
来初始化handle_friendrequest
,句号 .看起来您试图将
function
转换为void *
作为解决方法,但这没有任何意义 . 它根本不会编译 . 看到你问这个问题(如果我理解正确的话)很奇怪,因为编译器抱怨你自己插入代码中的无意义的无效演员 .您必须确保两个函数指针具有相同的类型,包括相同的参数列表 . 这将解决问题,并消除任何演员阵容的需要 . 只要参数列表不同,除了丑陋的黑客外,没有解决办法 .
正如错误消息所说的那样 . 在代码中的表达式中,您有
(void *)(function)
.那是
void *
的类型 . 但是,然后将其分配给具有函数指针类型的变量 . 通常,不可能在函数指针和对象指针之间进行转换,尽管某些实现可能允许它 .如果
Messenger
实际上是void *
的typedef,那么你可以删除(void *)
,因为function
和handle_friendrequest
具有相同的类型,因此不需要强制转换 .如果
Messenger
不是void *
,则您的目标代码将具有未定义的行为,因为函数指针具有不同的类型 . 考虑重新进行设计,以便您调用的函数实际上具有与函数指针类型相同的原型 .如果你真的想与未定义的行为斗争,代码将是:
当然功能必须知道它可能需要
void*
,而不是Messenger *