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
的最大成员。
我正在用 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
的最大成员。