之前在linux内核代码中看到结构体成员成员初始化使用类似于.owner = THIS_MODULE, 不太见过,于是搜了个博客,分享下:

转自:http://www.cnblogs.com/Anker/p/3545146.html

1、前言

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

 typedef struct _data_t {
int a;
int b;
}data_t; data_t data = {
.a = ,
.b = ,
};

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

2、顺序初始化

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

3、乱序初始化

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

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

4、测试程序

 /*********************************
* linux下C语言结构体初始化方法
* @author Anker @date:2014/02/11
* *******************************/ #include <stdio.h> //函数指针
typedef int (*caculate_cb)(int a, int b);
//结构体定义
typedef struct _oper {
int a;
int b;
caculate_cb cal_func;
} oper;
//加法函数定义
int add(int a, int b)
{
return (a+b);
} int main()
{
int ret = ;
//顺序初始化结构体1
oper oper_one = {, , add};
//乱序初始化结构体2
oper oper_two = {
.b = ,
.a = ,
.cal_func = &add,
};
//乱序初始化结构体3
oper oper_three = {
cal_func:&add,
a:,
b:,
};
ret = oper_one.cal_func(oper_one.a, oper_one.b);
printf("oper_one caculate: ret = %d\n", ret);
ret = oper_two.cal_func(oper_two.a, oper_two.b);
printf("oper_two caculate: ret = %d\n", ret);
ret = oper_three.cal_func(oper_three.a, oper_three.b);
printf("oper_three caculate: ret = %d\n", ret);
return ;
}

测试结果如下图所示:

5、参考资料

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

C基础--结构体成员初始化方式的更多相关文章

  1. OC基础--结构体 枚举做类成员属性

    结构体  枚举作类的成员属性: 定义一个学生类 性别 -- 枚举 生日 入学日期  毕业日期  --  结构体 代码示例: 声明文件 Student.h: #import <Foundation ...

  2. C语言结构体的初始化

    今天在工作时,看到了奇葩的结构体初始化方式,于是我查了一下C99标准文档和gcc的说明文档,终于搞清楚是怎么回事了. 假设有如下结构体定义: typedef struct { int a, b, c; ...

  3. 标记化结构初始化语法 在结构体成员前加上小数点 如 “.open .write .close ”C99编译器 .

    今天在看串口驱动(四)的时候 有这样一个结构体初始化 我很不理解 如下: static struct s3c24xx_uart_port s3c24xx_serial_ports[NR_PORTS] ...

  4. C++结构体成员列表初始化

    C++关于struct和class的区别,可以看上一篇文章:c ++ class和struct[转] 结构体成员列表初始化,来个例子: #include <iostream> #inclu ...

  5. go语言基础之结构体成员的使用指针变量

    1.结构体成员的使用:指针变量 示例: package main //必须有个main包 import "fmt" //定义一个结构体类型 type Student struct ...

  6. go语言基础之结构体成员的使用普通变量

    1.结构体成员的使用普通变量 示例: package main //必须有个main包 import "fmt" //定义一个结构体类型 type Student struct { ...

  7. go 基础 结构体

    结构体是类型中带有成员的复合类型.go语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. go语言中的类型可以被实例化,使用new和&构造类型实例的类型是类型的指针. 结构体 ...

  8. (转)关于linux中内核编程中结构体的赋值操作(结构体指定初始化)

    网址:http://blog.chinaunix.net/uid-24807808-id-3219820.html 在看linux源码的时候,经常会看到类似于下面的结构体赋值的代码: struct d ...

  9. 指针直接赋值为整型AND利用宏定义求结构体成员偏移量

    首先我们要更正一个很熟悉的概念,那就是指针不仅仅是“地址”,指针还有一个很重要的特性,那就是“类型”. 指针初始化时,“=”的右操作数; 除外,该语句表示指针为空): 所以 ; 这样的代码是不允许的. ...

随机推荐

  1. Java-->分割文件

    --> 通过IO 流将一个文件分割成多份 package com.dragon.java.splitfile; import java.io.File; import java.io.FileI ...

  2. js刷新当前页面

    a href="javascript:window.location.href=location.href"

  3. banner轮播图js

    例子1: if(!$('.side_ul ul').is(":animated")){            var wli = $('.side_ul li').width()+ ...

  4. Android——多线程编程练习题

    随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread类实 ...

  5. HTML DOM参考手册

    HTML DOM是HTML Document Object Model(文档对象模型)的缩写,HTML DOM则是专门适用与HTML/XHTML的文档对象模型.熟悉软件开发的人员可以将HTML DOM ...

  6. 关于MSP430中断机制

    中断很大程度上体现了一款单片机的性能,从这一点将MSP430在中断方面做得很不错,主要是提供了非常丰富的中断源,基本的有IO中断,定时器中断和一些接口中断(SPI,UART,I2C)等等.     现 ...

  7. 如果将彩色图像和灰度图像一起放进 CNN 中去,会是什么结果?

    如果将彩色图像和灰度图像一起放进 CNN 中去,会是什么结果? 今天,坑爹的实验,我处理 SUN397 的时候,忘记去掉灰度图了,结果,利用微调后的 model 提取 feature,悲剧的发现,无论 ...

  8. Comparison of B-Tree and Hash Indexes

    Understanding the B-tree and hash data structures can help predict how different queries perform on ...

  9. WCF Data Service 使用小结 —— 了解OData(一)

    最近做了一个小项目,其中用到了 WCF Data Service,之前是叫 ADO.NET Data Service 的.关于WCF Data Service,博客园里的介绍并不多,但它确实是个很好的 ...

  10. 20150826运算符,if语句

    运算符+ - * / % 加减乘除与注意:1.做除法运算时,如果两个操作数同为整数,则运算结果也是整数,不会出现小数.2.上面这些运算,如果两个操作数不同是一个类型,在运算的时候会自动进行类型转换. ...