GNU对C语言的扩展---结构体
来源:互联网 发布:cad线切割编程软件 编辑:程序博客网 时间:2024/06/06 02:14
C99结构体及数组的指定初始化(zz)
在阅读GNU/Linux内核代码时,我 们会遇到一种特殊的结构初始化方式。该方式是某些C教材(如谭二版、K&R二版)中没有介绍过的。这种方式称为指定初始化(designated initializer)。下面我们看一个例子,Linux-2.6.x/drivers/usb/storage/usb.c中有这样一个结构体初始化 项目:
static struct usb_driver usb_storage_driver = {
.owner = THIS_MODULE,
.name = "usb-storage",
.probe = storage_probe,
.disconnect = storage_disconnect,
.id_table = storage_usb_ids,
};
乍一看,这与我们之前学过的结构体初始化差距甚远。其实这就是前面所说的指定初始化在Linux设备驱动程序中的一个应用,它源自ISO C99标准。以下我摘录了C Primer Plus第五版中相关章节的内容,从而就可以很好的理解2.6版内核采用这种方式的优势就在于由此初始化不必严格按照定义时的顺序。这带来了极大的灵活 性,其更大的益处还有待大家在开发中结合自身的应用慢慢体会。
已知一个结构,定义如下
struct book {
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
C99支持结构的指定初始化项目,其语法与数组的指定初始化项目近似。只是,结构的指定初始化项目使用点运算符和成员名(而不是方括号和索引值)来标识具体的元素。例如,只初始化book结构的成员value,可以这样做:
struct book surprise = { .value = 10.99 };
可以按照任意的顺序使用指定初始化项目:
struct book gift = { .value = 25.99,
.author = "James Broadfool",
.title = "Rue for the Toad"};
正像数组一样,跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值。例如,考虑下列声明:
struct book gift = { .value = 18.90,
.author = "Philionna pestle",
0.25};
这将把值0.25赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值0.25代替了早先的赋值18.90。
有关designated initializer的进一步信息可以参考c99标准的6.7.8节Ininialization。
static struct usb_driver usb_storage_driver = {
.owner = THIS_MODULE,
.name = "usb-storage",
.probe = storage_probe,
.disconnect = storage_disconnect,
.id_table = storage_usb_ids,
};
乍一看,这与我们之前学过的结构体初始化差距甚远。其实这就是前面所说的指定初始化在Linux设备驱动程序中的一个应用,它源自ISO C99标准。以下我摘录了C Primer Plus第五版中相关章节的内容,从而就可以很好的理解2.6版内核采用这种方式的优势就在于由此初始化不必严格按照定义时的顺序。这带来了极大的灵活 性,其更大的益处还有待大家在开发中结合自身的应用慢慢体会。
已知一个结构,定义如下
struct book {
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
C99支持结构的指定初始化项目,其语法与数组的指定初始化项目近似。只是,结构的指定初始化项目使用点运算符和成员名(而不是方括号和索引值)来标识具体的元素。例如,只初始化book结构的成员value,可以这样做:
struct book surprise = { .value = 10.99 };
可以按照任意的顺序使用指定初始化项目:
struct book gift = { .value = 25.99,
.author = "James Broadfool",
.title = "Rue for the Toad"};
正像数组一样,跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值。例如,考虑下列声明:
struct book gift = { .value = 18.90,
.author = "Philionna pestle",
0.25};
这将把值0.25赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值0.25代替了早先的赋值18.90。
有关designated initializer的进一步信息可以参考c99标准的6.7.8节Ininialization。
0 0
- GNU对C语言的扩展---结构体
- 2.2.2 GNU C对标准C语言的扩展
- GNU对C的扩展
- GNU C 对标C的扩展
- GNU C的扩展
- GNU C的扩展
- GNU C的扩展
- GNU C的扩展
- GNU C对C的语言的扩展,摘自robert love的linux systerm programming一书
- GNU C语言的 扩展(一)语句表达式
- GNU C语言的 扩展(六)内建函数
- GNU C语言的 扩展(七)__attribute__测试
- 关于包含0长数组的结构体对齐问题(C语言 Linux_x64 GNU编译器)
- ARM编译器对C语言的扩展
- GCC 对C语言的扩展
- C++对C语言的扩展
- 对C语言中结构体的测试分析
- 对嵌入式开发C语言结构体的一点总结
- tar命令详解
- eclipse中ADT离线安装方法
- (前、中、后)序遍历二叉树的递归、非递归算法!
- C++ 将字符串转换成date类型的数据
- SymmetricTree
- GNU对C语言的扩展---结构体
- 珍惜着美好的时光
- [Java][MyBatis]mapperLocations属性通配符的使用
- 在iOS开发中自动获取当前的位置(GPS定位)
- 用户配置文件状态变成“备份”
- C++ 关于断点续传的方法,使用CURL技术
- HDOJ_就这么个烂题总是WA先放这把
- Ubuntu 12.10环境下Mochiweb安装
- R语言中的一些基本函数