从'void *'到'void(*)(..)'的转换无效

时间:2014-04-01 06:45:58

标签: c++ void

我有错误

  

从'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 个答案:

答案 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 *),因为functionhandle_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 *