现在新增字段需要对以下的文件进行变更,新增一个生产字段需要如下操作: 1. 在mactool_business.h文件中: 定义新的 data type名称的宏 以及对应的 data_type (eg. #define MACTOOL_CHINANET_BUSINESS_DT_GB28181ID 0x008B) 2. 在mactool_business.c文件中: 函数execute_mt_tlv_data()中根据data_type类型执行对应的写入操作,用swtich判断不同的data_type,新增对应的case以及对应case下的判断逻辑和写入功能(write_data_type()) 函数fill_mt_tlv_data()中根据data_type类型执行读取操作,用swtich判断不同的data_type,新增对应的case以及对应case下的读取功能(read_data_type()) 函数chinanet_factory_info_init()中新增初始化(read_data_type()) 3. 在mactool_cmd.h文件中: 新增TYPE_DATA_TYPE_CONFIG宏(eg. TYPE_XXX_ID_CONFIG) 结构体数组中新增(DS_STRING("xxx_id", GET_INFO_DATA, fac_info.xxx_id)) 函数write_fac_data中根据新增的TYPE_XXX_ID_CONFIG,增加新的case,在对应case中执行写入功能(write_data_type()) 4. 在mactool_flash.h文件中: 新增TOKEN的宏定义(eg. ##define XXX_ID_TOKEN "xxx_id") 新增写入(write_data_type())和读取(read_data_type())功能的声明 5. 在mactool_flash.c文件中: 新增写入函数(write_data_type()),将对应信息写入flash 新增读取函数(read_data_type()),读取flash中的对应信息 如何对源代码进行抽象,使得新增字段无需如此复杂的操作?
时间: 2024-03-15 11:48:02 浏览: 12
一种可能的抽象方式是使用结构体和函数指针来管理新增字段。具体来说,可以定义一个结构体,其中包含新增字段的名称、数据类型、写入函数和读取函数。然后,可以定义一个数组,用来存储所有新增字段的结构体。在程序运行时,可以根据数组中的信息来动态生成对应的宏定义、函数和其他相关代码。这样,新增字段时只需要在结构体数组中添加一个新的元素即可,无需手动修改多个文件。
以下是示例代码:
```c
#include <stdio.h>
// 定义新增字段的数据类型
typedef enum {
DT_GB28181ID = 0x008B,
DT_XXX_ID = 0x0100, // 新增字段的数据类型
} data_type_t;
// 定义新增字段的结构体
typedef struct {
const char* name; // 新增字段的名称
data_type_t type; // 新增字段的数据类型
void (*write_func)(void* data); // 写入函数指针
void (*read_func)(void* data); // 读取函数指针
} field_t;
// 定义新增字段的数组
field_t fields[] = {
{"gb28181id", DT_GB28181ID, write_gb28181id, read_gb28181id},
{"xxx_id", DT_XXX_ID, write_xxx_id, read_xxx_id}, // 新增字段的结构体
};
// 根据新增字段的数组生成宏定义
#define FIELD_NAME(index) fields[index].name
#define FIELD_TYPE(index) fields[index].type
// 根据新增字段的数组生成对应的写入函数和读取函数
#define WRITE_FUNC(index) fields[index].write_func
#define READ_FUNC(index) fields[index].read_func
// 写入函数示例
void write_gb28181id(void* data) {
printf("Writing gb28181id\n");
}
// 读取函数示例
void read_gb28181id(void* data) {
printf("Reading gb28181id\n");
}
// 写入函数示例
void write_xxx_id(void* data) {
printf("Writing xxx_id\n");
}
// 读取函数示例
void read_xxx_id(void* data) {
printf("Reading xxx_id\n");
}
// 主函数
int main() {
// 遍历新增字段的数组,生成对应的宏定义、函数等
for (int i = 0; i < sizeof(fields) / sizeof(field_t); i++) {
// 生成宏定义
#define FIELD_NAME_ ## i FIELD_NAME(i)
#define FIELD_TYPE_ ## i FIELD_TYPE(i)
// 生成写入函数和读取函数
void (*write_func)(void*) = WRITE_FUNC(i);
void (*read_func)(void*) = READ_FUNC(i);
// 使用写入函数和读取函数
write_func(NULL);
read_func(NULL);
}
return 0;
}
```
在上面的代码中,我们定义了一个`field_t`结构体,用来存储新增字段的信息。然后,我们定义了一个`fields`数组,用来存储所有新增字段的结构体。在主函数中,我们遍历`fields`数组,根据其中的信息生成对应的宏定义、函数等。需要注意的是,这里的写入函数和读取函数只是示例,实际的实现可能会更加复杂。