(转)关于linux中内核编程中结构体的赋值操作(结构体指定初始化)
Posted FREE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(转)关于linux中内核编程中结构体的赋值操作(结构体指定初始化)相关的知识,希望对你有一定的参考价值。
网址:http://blog.chinaunix.net/uid-24807808-id-3219820.html
在看linux源码的时候,经常会看到类似于下面的结构体赋值的代码:
- struct device my_dev =
- {
- .bus = &my_bus_type,
- .parent = &my_bus,
- .release = my_dev_release,
- };
整体上看,貌似与我们平时遇到的结构题赋值差不多,可是在变量前面加了一个点,好像我们就不知道是什么意思了。
上面的这种赋值方式成为指定初始化(designated initializer)。源自ISO C99标准。
C Primer Plus有比较详细的描述,如下:
已知一个结构体定义:
点击(此处)折叠或打开
{
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
C99支持结构体的指定初始化项目,其语法与数组的指定初始化近似。只是,结构体的指定初始化项目使用点运算符和成员名来标识具体的元素。
例如,只初始化book结构体中的成员value,可以这样做:
struct book a = {.value = 10.99};
可以按照任意的顺序使用初始化项目:
点击(此处)折叠或打开
- struct book gift =
- {
- .value = 25.90,
- .author = "Li Cong",
- .title = "Love Linux",
- };
和数组一样,跟在一个制定初始化项目之后的常规初始化项目为跟在指定成员后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值。例如:
{
.value = 18.90,
.author = "Li Cong",
20.0
};
注意:
1. 结构体指定初始化时,用到的就是点运算符加变量名,不许要指明类型,程序会自动匹配。
2. 右边的值类型尽量要匹配左边的类型。
3. 初始化时,变量之间可以用逗号分开,也可以用分号分开。
4. 整个结构体外边不要忘记分号。
内核采用这种方式的原因在于初始化时,不必严格按照定义时的顺序,这带来了极大的灵活性。
以上是关于(转)关于linux中内核编程中结构体的赋值操作(结构体指定初始化)的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核 内存管理memblock 分配器 ④ ( memblockmemblock_typememblock_region 结构体的关系 )