我有错误
从'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);
}
答案 0 :(得分:0)
在C中我认为你的代码会起作用,但是C ++不会让你隐式地将void*
强制转换为其他指针类型。我会做的
typedef void (*FunFriend)(void *, u_int8_t *, u_int8_t *, u_int16_t, void *);
.
.
.
FunFriend handle_friendrequest = (FunFriend)function;
答案 1 :(得分:0)
指针handle_friendrequest
的类型为
void (*)(void *, u_int8_t *, u_int8_t *, u_int16_t, void *)
指针function
的类型为
void (*)(Messenger *, u_int8_t *, u_int8_t *, u_int16_t, void *)
这是两种不同的函数指针类型,它们彼此完全不兼容。您无法使用function
初始化handle_friendrequest
,期间。
您似乎试图将function
转换为void *
作为解决方法,但这没有任何意义。它根本不会编译。很奇怪看到你问这个问题(如果我理解正确的话),因为编译器抱怨你自己插入代码中的无意义的无效演员。
您必须确保两个函数指针具有相同的类型,包括相同的参数列表。这将解决问题,并消除任何演员阵容的需要。只要参数列表不同,除了丑陋的黑客外,没有解决方案。
答案 2 :(得分:0)
正如错误消息所说的那样。在代码中的表达式中,您有(void *)(function)
。
类型为void *
。但是,然后将其分配给具有函数指针类型的变量。通常,不可能在函数指针和对象指针之间进行转换,尽管某些实现可能允许它。
如果Messenger
实际上是void *
的typedef,那么您可以删除(void *)
,因为function
和handle_friendrequest
具有相同的类型,所以没有演员是必要的。
如果Messenger
不是void *
,那么您的目标代码将具有未定义的行为,因为函数指针具有不同的类型。考虑重新进行设计,以便您调用的函数实际上具有与函数指针类型相同的原型。
如果你真的想要讨论未定义的行为,那么代码将是:
{
typedef void HANDLER(void *, uint8_t *, uint8_t *, u_int16_t, void *);
HANDLER *handle_friendrequest = (HANDLER *)function;
}
答案 3 :(得分:0)
void (*handle_friendrequest)(void *, u_int8_t *, u_int8_t *, u_int16_t, void *) =
(void (*)(void*, u_int8_t*, u_int8_t*, u_int16_t, void*))function;
当然,功能必须意识到它可能需要void*
,而不是Messenger *