首页 > 解决方案 > 使用结构时的代码重复

问题描述

我正在用 C 语言编写一个应用程序,它从服务器获取响应,解析它们并将它们存储在内存中,以便稍后对这些数据进行处理。服务器协议基于简单的命令,看起来像<Name of the command>#<arg1>#<arg2>...<argn>#%.

我决定通过以下方式将这些命令存储在我的程序中。我有一个基本结构消息,如下所示:

struct message
{
   enum message_type type;
   void *msg;
};

枚举看起来像这样:

enum message_type
{
   MSG1,
   MSG2,
   ...
   MSGN
};

以及具体消息:

struct specific_message
{
   int arg1;
   char *arg2;
   ...
   type argn;
};

要对这些消息进行一些操作,我在功能上有很大的切换,例如:

struct message *create_message(enum message_type type)
{
  struct message *res;

  res = malloc(sizeof(*res));

  res->type = type;
  switch(type)
  {
     case MSG1: res->msg = create_msg1(); break;
     ...
     case MSGN: res->msg = create_msgn(); break;
     default: fprintf(stderr, "Unknown msg\n"); free(res); return NULL;
  }

  return res; 
}

并且特定的看起来几乎相同(例如,如果该字段是一个指针,它用 NULL 初始化,如果 int 用 -1 等......)

起初我是自己手动完成的,但是在编写了几个这样的函数之后,我决定编写一个脚本,它从标题中获取结构并生成这样的函数(初始化特定消息中的字段,销毁特定消息,复制等......) .

它工作正常,但是实现文件的大小变得非常大(现在大约1000行,只是创建,复制和销毁)。而且我不能通过宏来写这些(至少我不知道怎么写),因为宏对结构的布局一无所知。所以整个文件变得重复。

我考虑了不同的方法,例如只使用包含命令类型、参数数量和 char* 数组的基本消息结构,其中包含字符串形式的这些参数。但随后我需要添加所有这些逻辑,以便从该数组中检索我需要的参数并将其转换为我需要的类型。所以我认为它不会扩展。

我可以使用另一种方法吗?

标签: cdata-structuresrepeat

解决方案


推荐阅读