从'void*'到'void (*)(..)'的转换无效
Invalid conversion from 'void*' to '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*)}' [-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 *)
,因为function
和handle_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 *
- 错误:从'void*'到'const uint8_t* {aka const unsigned char*}'的转换无效 [-允许]
- 从类型"void*"到函数指针的强制转换无效
- 在c++std::函数的上下文中无效使用void表达式
- 从类型"void*"到类member_function指针的强制转换无效
- 无效地将 void 表达式与队列和 .pop() 一起使用
- 递归中无效的 void 操作数
- 错误:在 DLSYSM 的情况下,从“void*”到“void (*)()”的转换无效
- 为什么pthread_join给出此错误?[错误] 从'void*'到'void**'的转换无效 [-允许]
- 从“ void*”到“ pthread_t*”的无效转换
- 从"void*"到"void(*)(void*)"的转换无效
- 使用多线程处理对象数组 - 无效使用 void 表达式错误
- 从 void(WINAPI*)(..) 到 LPVOID 的强制转换无效
- 错误:从 'int' 到 'void*' 的转换无效 [-允许]
- 组合模板参数形成函数签名时无效的 void 参数
- mingw 编译错误:从 'FARPROC ' 到 'void*' 的转换无效,但 msvc 编译正常
- C STD ::线程无效的void表达式使用
- 从文件读取链表C++从 void* 到 char* 的转换无效
- 墨西哥:错误:从“void*”到“double*”的转换无效[-允许]
- 从类型 'MyStruct' 转换为类型 'void*' 无效
- 为什么 std::p ackaged_task<void()> 无效?