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

Invalid conversion from 'void*' to 'void (*)(..)'

本文关键字:void 无效 转换      更新时间:2023-10-16

我有错误

从"void*"到"void ()(void, u_int8_t*, u_int8_t*, u_int16_t, void*) {aka void ()(void, unsigned char

*, unsigned char*, short unsigned int, void*)}' [-fallowive]

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);
}

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

typedef void (*FunFriend)(void *, u_int8_t *, u_int8_t *, u_int16_t, void *);
.
.
.
FunFriend handle_friendrequest = (FunFriend)function;

指针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 *作为一种解决方法,但这没有任何意义。它根本无法编译。看到你问这个问题很奇怪(如果我理解正确的话),因为编译器抱怨你自己插入到代码中的无意义的无效强制转换。

必须确保两个函数指针具有相同的类型,包括相同的参数列表。这将解决问题并消除对任何铸件的需求。只要参数列表不同,除了丑陋的黑客之外,就没有解决方案。

正如错误消息所说。在代码的表达式中,您有(void *)(function) .

那是类型 void * .但是,随后将其分配给具有函数指针类型的变量。通常,无法在函数指针和对象指针之间进行转换,尽管某些实现可能允许这样做。

如果Messenger实际上是void *的 typedef,那么您可以删除(void *),因为functionhandle_friendrequest具有相同的类型,因此不需要强制转换。

如果未void * Messenger则预期的代码将具有未定义的行为,因为函数指针具有不同的类型。请考虑重新进行设计,以便调用的函数实际上与函数指针的类型具有相同的原型。

如果你真的想坚持未定义的行为,代码将是:

{
    typedef void HANDLER(void *, uint8_t *, uint8_t *, u_int16_t, void *);
    HANDLER *handle_friendrequest = (HANDLER *)function;
}
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 *