c - 使用结构时的代码重复
问题描述
我正在用 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* 数组的基本消息结构,其中包含字符串形式的这些参数。但随后我需要添加所有这些逻辑,以便从该数组中检索我需要的参数并将其转换为我需要的类型。所以我认为它不会扩展。
我可以使用另一种方法吗?
解决方案
推荐阅读
- java - 不能让它运行 PAYROLL PROJECT java
- c# - 如何使用 C# 更改 getter 中的值?
- wpf - 如何使多个 SolidColorBrush 引用 ResourceDictionary 中的一种颜色?
- sass - Gatsby 在使用带有 '@use 'sass:color' 的 Sass 文件后失败
- oauth - 在一个请求中获取 Shopify 商店使用的所有标签
- ruby-on-rails - 要求 Rails 模型具有来自模块的特定方法
- spring - Spring MVC 无法配置视图的路径
- php - 在 GKE 上部署新的 Wordpress 太多重定向问题
- python - 为什么这个函数不会将文本文件中的值附加到我的列表中?
- java - 如何从文件中的一行中分别读取整数和字符串并将它们存储到变量中?