C 带有void指针参数的回调产生警告

C 带有void指针参数的回调产生警告,c,compiler-warnings,void-pointers,C,Compiler Warnings,Void Pointers,我有以下代码: /* callback taking a pointer to a "generic" msg as argument */ typedef void (*Callback_t)(void *msg); /* initialize callback pointer */ Callback_t const Callback[] = { ProcessMsgAction0, /**< 0: MSGID_ACTION_0 */ ProcessMsgAction1,

我有以下代码:

/* callback taking a pointer to a "generic" msg as argument */
typedef void (*Callback_t)(void *msg);

/* initialize callback pointer */
Callback_t const Callback[] =
{
  ProcessMsgAction0,  /**< 0: MSGID_ACTION_0 */
  ProcessMsgAction1,  /**< 1: MSGID_ACTION_1 */
  /* ... */
};

/* Call the callback according to msgid */
msg = GetMessage();
Callback[msg->id](msg);

/* implement callback for each message id */
void ProcessMsgAction0(action0_t *msg) { /* ... */ }
void ProcessMsgAction1(action1_t *msg) { /* ... */ }
/*以指向“通用”消息的指针作为参数的回调*/
typedef void(*Callback_t)(void*msg);
/*初始化回调指针*/
回调\u t常量回调[]=
{
ProcessMsgAction0,/**<0:MSGID\u操作\u 0*/
进程msgaction1,/**<1:MSGID\u ACTION\u 1*/
/* ... */
};
/*根据msgid调用回调函数*/
msg=GetMessage();
回调[msg->id](msg);
/*为每个消息id实现回调*/
void ProcessMsgAction0(action0_t*msg){/*…*/}
void ProcessMsgAction1(action1_t*msg){/*…*/}
我认为void*被认为是通用指针。因此,无论我给出什么地址,它都不会产生警告,但在上述情况下,
action0\u t*
void*
不同,因此它会产生以下警告:
从不兼容的指针类型初始化

如果要抑制警告,将ProcessMsgAction参数更改为void*的唯一解决方案是什么

使用的编译选项:-ansi-pedantic-Wall-Wextra

I though void* was considered as generic pointer
这是真的,但是这个概念并没有扩展到匹配函数类型中的参数


一个简单的类型转换到
Callback\u t
是有效的,但是,应该注意,这是未定义的(取决于OP对指针的实际作用,但它看起来最终会是未定义的)。(还注意到,它在大多数机器上都能工作,我真的想不出一种编译器可以利用UB等的方法)或者用C风格的指针转换来代替
reinterpret_cast
(这是一个C问题,不是C++)。。不要这样做。最好将函数声明为
void ProcessMsgAction0(void*msg){}
并从
void*
内部强制转换为
action0\u t*
。我想避免它,但除了使用它,我别无选择。每个消息都有不同的结构大小,但使用相同的方式。