C语言结构体数组初始化

一、使用场景

  1. 在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;
    }
    

    这样写,别人看代码,就很容易看到:

从而更快速理解其中的隐藏逻辑。阅读代码效率更高。

二、问题和解决

  1. 如果在映射表中需要添加参数,怎么办?

    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中情况。
    };

    使用这种方法,可以对抗成员的添加或者顺序变化。

  2. 如果某些行不想被初始化,或者不需要被初始化。或者希望提升访问的效率。怎么办?

    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] 直接访问对应的情况。

三、参考

  1. 《Unix编程艺术》
  2. https://www.cnblogs.com/hansjorn/p/4693840.html

整理C语言结构体数组初始化相关推荐

  1. c语言字符结构数组初始化,C语言结构体数组初始化问题

    C语言结构体数组指定初始化器时,下面的三种方法,只有第三种可以,但是第一,二种,我看不出语法上哪错了,编译器DEVc++会报错 [Error] C99 designator 'num_insur' o ...

  2. C语言 | 结构体数组

    C语言结构体数组概述 一个结构体变量中可以存放一组有关联的数据,如一个学生的学号.姓名.成绩等数据,如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组. 结构体数组与之前介绍的数值型 ...

  3. c语言+结构体指针初始化,c语言结构体指针初始化===

    c语言结构体指针初始化 今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以 ...

  4. java 结构体数组初始化_C数组结构体联合体快速初始化

    背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元 ...

  5. c语言 结构体数组的赋值

    c语言 结构体数组的赋值 //**创建结构体** #include<stdio.h> struct Class{int id;char name[10]; }; //******结构体数组 ...

  6. C语言结构体——指定初始化

    概述 C 语言结构体指定初始化(Designated Initializer)实现上有两种方式: 一种是通过点号加赋值符号实现,即.fieldname = value, 另一种是通过冒号实现,即fie ...

  7. c语言如何为结构数组赋值,C语言结构体数组同时赋值的另类用法

    说到C语言结构体数组的同时赋值,许多人一想就会想到用以下的这种方法,咱们来写一个例子: #include struct student { int a; int b ; int c ; }; stru ...

  8. C语言学习笔记---结构体数组初始化

      既然结构体是一种数据类型,那么它也可以定义为数组的形式.比如要描述一本书的信息,可以将书的名称,作者,价格这些信息用一个结构体来描述,在使用的过程中不可能只描述一本书,所以就需要使用一个结构体数组 ...

  9. C语言结构体数组的使用

    1.结构体数组的优点 结构体可以存储不同的数据类型,将他们互相联系起来.结构体数组可以连续存储多个结构体,和数组作用相似.比如想定义同一个最小外接矩形的四个坐标值,并给予这个矩形一个特征编号.当需要存 ...

  10. C语言结构体数组,结构体数组的定义,结构体数组的输出,结构体的应用

    结构体数组 结构体数组的定义: 结构体数组格式:声明变量类型 数组名称[数组长度] //定义一个结构体数组名为a,它里面包含有5个元素,每一个元素都是一个结构体变量 Wor a[5]={}; #inc ...

最新文章

  1. Hibernate Criterion
  2. python手机版下载官方-Python
  3. 数据中心着火,工程师用嘴一吹就灭了?
  4. Android与Js交互时,屏幕不适配问题
  5. 【BZOJ-4631】踩气球 线段树 + STL
  6. 使用GRU单元的RNN模型生成唐诗
  7. 博客网站源代码_详解SEO布词以及网站排名优化技巧
  8. Javascript学习数据结构--集合(Set实现)
  9. 【评论分享有礼】毕业遇上疫情怎么办?4条技术指南轻松应对(内含求职、租房攻略)
  10. 【牛客网】Whalyzh's Problem
  11. 电子测量技术——基于Python的测量数据误差处理程序
  12. 使用Python+TensorFlow2构建基于卷积神经网络(CNN)的ECG心电信号识别分类(二)
  13. 售前是做什么的?需要具备什么能力?
  14. ODL:OpenDayLight项目中子项目统计(二)
  15. 原生微信小程序使用class 三元运算符实现多选案例
  16. 如何实现调用阿里云三方的api
  17. 删除数据后如何及时释放存储空间
  18. sip gw功能包括_全面解读SiP
  19. HbuilderX 无法运行项目到真机调试。
  20. 查看笔记本电池健康度的两种方法和电池报告解析

热门文章

  1. git 版本控制~ 文件没有绿色和红色图标
  2. Nacos连接不上:Ignore the empty nacos configuration and get it based on dataId
  3. Unmapped Spring configuration files found.
  4. 三维家可以导入别人的方案吗_酷家乐怎么用别人的模型(如何从酷家乐软件做的方案导入到另一个酷家乐账号上)...
  5. 5款瞬间复活Win7/8/10工具
  6. 如何生成你自己的icon 图标库
  7. excel转置怎么操作_技能篇:Excel数据处理小技巧
  8. 基于 AUTOSAR 的电动汽车中央控制单元 CAN 通信软件开发
  9. win10很多软件显示模糊_Win7系统和Win10系统你会怎么选?
  10. 爬取Whatsapp群链接