C 抽象限制

C Abstract Limitation

我正在用 C 语言制作一个网络服务器,并尝试尽可能通用地定义数据包处理程序。

当我收到一个完整的数据包时,我想创建一个结构并将其发送到定义的处理程序。

struct handler {
   char *msg_name;
   void (*handler)(network_client *, void *msg).
}

//global variable containing all handlers
struct handler const handlers[] = {
   {"hello_msg", &helloMessageHandler}
};

struct hello_message_s {
   int foo;
   char *bar;
   float foobar;
}

//called when received hello_cmd and deserialized hello_message_s bytes received by the network
void helloMessageHandler(network_client *c, void *msg) {
   struct hello_message_s *casted = msg;

   casted->foo; //etc..
}

我的问题是;有没有办法直接指定消息结构而不是 void * 强制我稍后投射? 即,将 void helloMessageHandler(network_client *c, void *msg) 更改为 void helloMessageHandler(network_client *c, struct hello_message_s *msg)

这是不可能的,因为 handlers[] 只能容纳 void * 的处理程序。

struct handler const handlers[] = {
   {"hello_msg", &helloMessageHandler}
};

有什么解决办法吗?

如果您只有有限数量的 struct 描述一个数据包,您可以使用 union 包括所有数据包而不是 void *

但据我所知,void * 的用法更为普遍。使用 union 的缺点是它的大小将等于 union 的最大成员。