整理C语言结构体数组初始化
C语言结构体数组初始化
一、使用场景
在C编码中,经常需要对结构体数组进行初始化。
使用这种方法,能够使得代码更加的清晰,易读。
例如:需要根据返回码,一个status code 做不同的操作。
int process_by_status_code(int status_code) {if(status_code == 180){//do process 1}else if(status_code == 183){//do process 2}else if(status_code == 200){//do process 3}//........此处省略100中情况。return 0; }
需要注意,使用这种方式编码,随着要处理的情况不断增多,函数必然会越来越大。而且根据《unix编程艺术》中说的,人类大脑更加的善于处理数据,而不是逻辑。
因此可能可以换一种写法:
typedef struct int (*status_code_process_callback)(void *param); typedef struct status_code_process_map {int status_code;status_code_process_callback fn_process; }status_code_process_map;status_code_process_map g_status_code_process_map_list[]= {{180,process_180},{183,process_183},{200,process_200},//.....此处省略N中情况。 };int process_180(void *param) {//do 180 processreturn 0; } int process_183(void *param) {//do 183 processreturn 0; }int process_by_status_code(int status_code) {int i = 0;for(i = 0; i < sizeof(g_status_code_process_map_list)/sizeof(g_status_code_process_map_list[0]); i++){if(g_status_code_process_map_list[i].fn_process){return g_status_code_process_map_list[i].fn_process(&status_code);}}return 0; }
这样写,别人看代码,就很容易看到:
从而更快速理解其中的隐藏逻辑。阅读代码效率更高。
二、问题和解决
如果在映射表中需要添加参数,怎么办?
typedef struct int (*status_code_process_callback)(void *param); typedef struct status_code_process_map {int status_code;void *param;//需要添加一个参数。status_code_process_callback fn_process; }status_code_process_map;
那,初始化就不合理了。
对于可能变化成员,或者变化成员顺序的初始化,需要使用这种方法:
status_code_process_map g_status_code_process_map_list[]= {{.status_code = 180,.fn_process = process_180},{.status_code = 183,.fn_process = process_183//可以部分初始化},{.status_code = 200,.param = NULL,.fn_process = process_200}//.....此处省略N中情况。 };
使用这种方法,可以对抗成员的添加或者顺序变化。
如果某些行不想被初始化,或者不需要被初始化。或者希望提升访问的效率。怎么办?
status_code_process_map g_status_code_process_map_list[]= {{180,process_180},{183,process_183},//这一行,我认为不需要出现在这里 ,但是又希望其空间是被分配的{200,process_200},//.....此处省略N中情况。 };
//这里只能使用status_code进行查找。能否直接调用呢? int process_by_status_code(int status_code) {int i = 0;for(i = 0; i < sizeof(g_status_code_process_map_list)/sizeof(g_status_code_process_map_list[0]); i++){if(g_status_code_process_map_list[i].fn_process){return g_status_code_process_map_list[i].fn_process(&status_code);}}return 0; }
可以使用枚举:
enum {E_STATUS_180,E_STATUS_183,E_STATUS_200,//此处省略N种情况 };status_code_process_map g_status_code_process_map_list[]= {[E_STATUS_180]{180,process_180},[E_STATUS_183]{183,process_183},//这一行,我认为不需要出现在这里 ,但是又希望其空间是被分配的[E_STATUS_200]{200,process_200},//.....此处省略N中情况。 };
使用这种写法,可以省略掉183的初始化,也可以使用g_status_code_process_map_list[E_STATUS_200] 直接访问对应的情况。
三、参考
- 《Unix编程艺术》
- https://www.cnblogs.com/hansjorn/p/4693840.html
整理C语言结构体数组初始化相关推荐
- c语言字符结构数组初始化,C语言结构体数组初始化问题
C语言结构体数组指定初始化器时,下面的三种方法,只有第三种可以,但是第一,二种,我看不出语法上哪错了,编译器DEVc++会报错 [Error] C99 designator 'num_insur' o ...
- C语言 | 结构体数组
C语言结构体数组概述 一个结构体变量中可以存放一组有关联的数据,如一个学生的学号.姓名.成绩等数据,如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组. 结构体数组与之前介绍的数值型 ...
- c语言+结构体指针初始化,c语言结构体指针初始化===
c语言结构体指针初始化 今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以 ...
- java 结构体数组初始化_C数组结构体联合体快速初始化
背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元 ...
- c语言 结构体数组的赋值
c语言 结构体数组的赋值 //**创建结构体** #include<stdio.h> struct Class{int id;char name[10]; }; //******结构体数组 ...
- C语言结构体——指定初始化
概述 C 语言结构体指定初始化(Designated Initializer)实现上有两种方式: 一种是通过点号加赋值符号实现,即.fieldname = value, 另一种是通过冒号实现,即fie ...
- c语言如何为结构数组赋值,C语言结构体数组同时赋值的另类用法
说到C语言结构体数组的同时赋值,许多人一想就会想到用以下的这种方法,咱们来写一个例子: #include struct student { int a; int b ; int c ; }; stru ...
- C语言学习笔记---结构体数组初始化
既然结构体是一种数据类型,那么它也可以定义为数组的形式.比如要描述一本书的信息,可以将书的名称,作者,价格这些信息用一个结构体来描述,在使用的过程中不可能只描述一本书,所以就需要使用一个结构体数组 ...
- C语言结构体数组的使用
1.结构体数组的优点 结构体可以存储不同的数据类型,将他们互相联系起来.结构体数组可以连续存储多个结构体,和数组作用相似.比如想定义同一个最小外接矩形的四个坐标值,并给予这个矩形一个特征编号.当需要存 ...
- C语言结构体数组,结构体数组的定义,结构体数组的输出,结构体的应用
结构体数组 结构体数组的定义: 结构体数组格式:声明变量类型 数组名称[数组长度] //定义一个结构体数组名为a,它里面包含有5个元素,每一个元素都是一个结构体变量 Wor a[5]={}; #inc ...
最新文章
- Hibernate Criterion
- python手机版下载官方-Python
- 数据中心着火,工程师用嘴一吹就灭了?
- Android与Js交互时,屏幕不适配问题
- 【BZOJ-4631】踩气球 线段树 + STL
- 使用GRU单元的RNN模型生成唐诗
- 博客网站源代码_详解SEO布词以及网站排名优化技巧
- Javascript学习数据结构--集合(Set实现)
- 【评论分享有礼】毕业遇上疫情怎么办?4条技术指南轻松应对(内含求职、租房攻略)
- 【牛客网】Whalyzh's Problem
- 电子测量技术——基于Python的测量数据误差处理程序
- 使用Python+TensorFlow2构建基于卷积神经网络(CNN)的ECG心电信号识别分类(二)
- 售前是做什么的?需要具备什么能力?
- ODL:OpenDayLight项目中子项目统计(二)
- 原生微信小程序使用class 三元运算符实现多选案例
- 如何实现调用阿里云三方的api
- 删除数据后如何及时释放存储空间
- sip gw功能包括_全面解读SiP
- HbuilderX 无法运行项目到真机调试。
- 查看笔记本电池健康度的两种方法和电池报告解析
热门文章
- git 版本控制~ 文件没有绿色和红色图标
- Nacos连接不上:Ignore the empty nacos configuration and get it based on dataId
- Unmapped Spring configuration files found.
- 三维家可以导入别人的方案吗_酷家乐怎么用别人的模型(如何从酷家乐软件做的方案导入到另一个酷家乐账号上)...
- 5款瞬间复活Win7/8/10工具
- 如何生成你自己的icon 图标库
- excel转置怎么操作_技能篇:Excel数据处理小技巧
- 基于 AUTOSAR 的电动汽车中央控制单元 CAN 通信软件开发
- win10很多软件显示模糊_Win7系统和Win10系统你会怎么选?
- 爬取Whatsapp群链接