当前位置: 首页 > news >正文

Linux下C结构体初始化[总结]

1、前言

  今天在公司看一同事写的代码,代码中用到了struct,初始化一个struct用的是乱序格式,如下代码所示:

typedef struct _data_t {
    int a;
    int b;
}data_t;

data_t data = {
   .a = 10,
   .b = 20,
};

   通常初始化一个结构体的方式是按序初始化,形如:data_t data={10,20}。感觉很好奇,如是上网百度一下,发现linux下struct初始化可以采用顺序和乱序两种方式,而乱序又有两种不同的形式。本文总结一下struct两种初始化方式的优缺点,并给出完整的测试程序。

2、顺序初始化

  教科书上讲C语言结构体初始化是按照顺序方式来讲的,没有涉及到乱序的方式。顺序初始化struct必须要按照成员的顺序进行,缺一不可,如果结构体比较大,很容易出现错误,而且表现形式不直观,不能一眼看出各个struct各个数据成员的值。

3、乱序初始化

  乱序初始化是C99标准新加的,比较直观的一种初始化方式。相比顺序初始化而言,乱序初始化就如其名,成员可以不按照顺序初始化,而且可以只初始化部分成员,扩展性较好。linux内核中采用这种方式初始化struct。

  乱序初始化有两种方式,一种是用点(.)符号,一种是用冒号(:)。方式1是C99标准,方式2是GCC的扩展,强烈建议使用第一种方式。

4、测试程序

 1 /*********************************
 2  * linux下C语言结构体初始化方法
 3  * @author  Anker  @date:2014/02/11
 4  * *******************************/
 5 
 6 #include <stdio.h>
 7 
 8 //函数指针
 9 typedef int (*caculate_cb)(int a, int b);
10 //结构体定义
11 typedef struct _oper {
12     int a;
13     int b;
14     caculate_cb cal_func;
15 } oper;
16 //加法函数定义
17 int add(int a, int b)
18 {
19     return (a+b);
20 }
21 
22 int main()
23 {
24     int ret = 0;
25     //顺序初始化结构体1
26     oper oper_one = {10, 20, add};
27     //乱序初始化结构体2
28     oper oper_two = {
29         .b = 30,
30         .a = 20,
31         .cal_func = &add,
32     };
33     //乱序初始化结构体3
34     oper oper_three = {
35          cal_func:&add,
36          a:40,
37          b:20,
38     };
39     ret = oper_one.cal_func(oper_one.a, oper_one.b);
40     printf("oper_one caculate: ret = %d\n", ret);
41     ret = oper_two.cal_func(oper_two.a, oper_two.b);
42     printf("oper_two caculate: ret = %d\n", ret);
43     ret = oper_three.cal_func(oper_three.a, oper_three.b);
44     printf("oper_three caculate: ret = %d\n", ret);
45     return 0;
46 }

测试结果如下图所示:

5、参考资料

http://blog.csdn.net/adaptiver/article/details/7494081

转载于:https://www.cnblogs.com/Anker/p/3545146.html

相关文章:

  • linux环境搭建过程中遇到的问题
  • 我的北漂在路上--------时不时的停下脚步思考
  • Linux系统管理的基本入手点
  • 使用Android中的通知心得
  • 顺序发送异步请求、同时发送异步请求;apply()与call()的区别
  • 胖子哥的大数据之路(三)- 数据仓库的需求分析该怎么做
  • Ex2010学习(九),个性化OWA界面
  • 郑州表达式
  • 设计模式笔记-观察者(Observer)
  • python升级带来的yum异常
  • 【Java】IO Stream详细解读
  • 第三十课:光的偏振
  • mysql 5.5安装手记
  • python之read,readline,readlines区别
  • 淘宝性能测试线下测试与线上跟踪体系
  • 【笔记】你不知道的JS读书笔记——Promise
  • angular学习第一篇-----环境搭建
  • ECS应用管理最佳实践
  • JavaScript函数式编程(一)
  • leetcode98. Validate Binary Search Tree
  • Python进阶细节
  • python学习笔记-类对象的信息
  • SpringCloud集成分布式事务LCN (一)
  • SQLServer之索引简介
  • 创建一个Struts2项目maven 方式
  • 坑!为什么View.startAnimation不起作用?
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​linux启动进程的方式
  • ​渐进式Web应用PWA的未来
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #android不同版本废弃api,新api。
  • (1)Android开发优化---------UI优化
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (四)汇编语言——简单程序
  • (译)计算距离、方位和更多经纬度之间的点
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转) 深度模型优化性能 调参
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • *p++,*(p++),*++p,(*p)++区别?
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET命令行(CLI)常用命令
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @Autowired @Resource @Qualifier的区别
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [APIO2012] 派遣 dispatching
  • [CodeForces-759D]Bacterial Melee
  • [delphi]保证程序只运行一个实例
  • [Django 0-1] Core.Handlers 模块
  • [LeeCode]—Wildcard Matching 通配符匹配问题
  • [linux]centos7下解决yum install mysql-server没有可用包