现在新增字段需要对以下的文件进行变更,新增一个生产字段需要如下操作: 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`数组,根据其中的信息生成对应的宏定义、函数等。需要注意的是,这里的写入函数和读取函数只是示例,实际的实现可能会更加复杂。

相关推荐

最新推荐

recommend-type

探讨:sql插入空,默认1900-01-01 00:00:00.000的解决方法详解

sql2005 若字段定义的类型为datetime,插入为”(空),那么会默认值为1900-01-01 00:00:00.000 解决方法查询的时候过滤下cast(nullif(”,”) as datetime) 代码如下:select cast(” as datetime) , cast(nullif(”,”)...
recommend-type

基于JavaScript实现Json数据根据某个字段进行排序

主要介绍了基于JavaScript实现Json数据根据某个字段进行排序的相关资料,需要的朋友可以参考下
recommend-type

K3_BOS单据新增字段方法.doc

网管qqcc 图文教程 K3_BOS单据新增字段方法 这个确实只有三个图,比较简单,但是有时候就是找不到在哪里,所以这个资源还是保留,下载不要分
recommend-type

mysql更新一个表里的字段等于另一个表某字段的值实例

下面小编就为大家带来一篇mysql更新一个表里的字段等于另一个表某字段的值实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

mysql批量更新多条记录的同一个字段为不同值的方法

首先mysql更新数据的某个字段,一般这样...这里注意 ‘other_values’ 是一个逗号(,)分隔的字符串,如:1,2,3 如果更新多条数据而且每条记录要更新的值不同,可能很多人会这样写: foreach ($values as $id =&gt; $myv
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

info-center source defatult

这是一个 Cisco IOS 命令,用于配置 Info Center 默认源。Info Center 是 Cisco 设备的日志记录和报告工具,可以用于收集和查看设备的事件、警报和错误信息。该命令用于配置 Info Center 默认源,即设备的默认日志记录和报告服务器。在命令行界面中输入该命令后,可以使用其他命令来配置默认源的 IP 地址、端口号和协议等参数。
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。