C Абстрактное ограничение - PullRequest
0 голосов
/ 08 июня 2018

Я делаю сетевой сервер на 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).

Это невозможно, поскольку обработчики [] могут содержать обработчики только с void *.

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

Любое решение?

1 Ответ

0 голосов
/ 08 июня 2018

Если у вас есть только конечное число struct s, описывающих пакет, вы можете использовать union, включая все пакеты, вместо void *.

Но использование void * более распространено, насколько я знаю.Недостатком использования union является то, что его размер будет равен наибольшему члену union.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...