首页 文章

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

提问于
浏览
-1

我有错误

从'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

    在C中我认为你的代码可以工作,但C不会让你隐式地将 void* 转换为其他指针类型 . 我会做

    typedef void (*FunFriend)(void *, u_int8_t *, u_int8_t *, u_int16_t, void *);
    
    .
    .
    .
    FunFriend handle_friendrequest = (FunFriend)function;
    
  • 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 * 作为解决方法,但这没有任何意义 . 它根本不会编译 . 看到你问这个问题(如果我理解正确的话)很奇怪,因为编译器抱怨你自己插入代码中的无意义的无效演员 .

    您必须确保两个函数指针具有相同的类型,包括相同的参数列表 . 这将解决问题,并消除任何演员阵容的需要 . 只要参数列表不同,除了丑陋的黑客外,没有解决办法 .

  • 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;
    }
    
  • 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 *

相关问题