C语言:标记化结构初始化语法
来源:互联网 发布:物流网络的特点 编辑:程序博客网 时间:2024/06/05 01:58
转载自http://www.cnblogs.com/omenglvrong1/p/4363821.html
以前在看Linux代码时,就对它的结构体初始化写法感到奇怪,所有的初始化代码都写清了变量名,并且变量名前面还有一个诡异的点。最近学习Linux设备驱动,又遇到了,就查了一下,发现自己的知识果然纰漏不少,此种初始化写法并不是什么特殊的代码风格,而是所谓的C语言标记化结构初始化语法(designated initializer),而且还是一个ISO标准。
#include <stdio.h> #include <stdlib.h> struct operators { void (*read1)(char *); void (*read2)(char *); void (*read3)(char *); int n; }; void read1(char *data) { printf("read1: %s/n",data); } void read2(char *data) { printf("read2: %s/n",data); } void read3(char *data) { printf("read3: %s/n",data); } int main() { //传统的初始化方法 //struct operators my_op = {read1, read2, read3, 100}; //所谓的标记化结构初始化语法 struct operators my_op = {.read2 = read2, .read1 = read1, .read3 = read3, .n = 100}; my_op.read1("wangyang"); my_op.read2("wangyang"); my_op.read3("wangyang"); return 0; }
那它的好处在哪里呢?我想好处有三:
首先,标记传参不用理会参数传递的顺序,正如我上面的例子表示的那样,我是先初始化了read2,然后再初始化了read1,程序员不用记忆参数的顺序;
其次,我们可以选择性传参,在传统C语言顺序传参中,如果你只想对第三个变量进行初始化,那么你不得不给第一个, 第二个参数进行初始化,而有时候一个变量并没有很合适的默认值,而使用标记初始化法,你可以相当自由地对你有把握的参数进行初始化;
第三,扩展性更好,如果你要在该结构体中增加一个字段,传统方式下,为了考虑代码修改量,你最好将新添加的字段放在这个结构体的最后面,否则你将要面对大量且无趣的修改,你可能觉得放在哪里没什么关系,但是我们都习惯了,姓名下面是性别,性别下面是年龄,接着是兴趣爱好,最后是事迹描述,如果年龄放在了最后面,难道不别扭么?!
其实,该种初始化语法并不是什么新技术,新定义,它就是ISO C99的一个标准用法,也就是说99年就有了,再说Linus也不会去赶什么时髦的,据说C Primer Plus第五版中提到了这点,不过,我没有看过该书,遗憾,我是直接投入了面向对象的怀抱。
GCC有扩展标记化结构初始化语法,写法是下面这样的:
struct operators my_op = {read2 : read2, read1 : read1, read3 : read3,};
- 标记化结构初始化语法(C语言)
- C语言标记化结构初始化语法
- 标记化结构初始化语法(C语言)
- 标记化结构初始化语法(C语言)
- 标记化结构初始化语法(C语言)
- 标记化结构初始化语法(C语言)
- C语言:标记化结构初始化语法
- C语言标记化结构初始化语法扫盲
- C的标记化结构初始化语法
- c的标记化结构初始化语法
- c语言之遗漏---标准C的标记化结构初始化语法
- 标记化结构初始化语法
- 标记化结构初始化语法
- 标准C的标记化结构初始化语法
- C 标记化结构初始化语法 点运算符
- 标准C的标记化结构初始化语法
- 标准C的标记化结构初始化语法
- 标准C的标记化结构初始化语法
- ZZULIOJ 1331弟弟的作业
- [caffe]:关于调用caffe库,cmake 编译问题
- 观察者设计模式
- Android添加一个新分区
- 数据库-在表中插入数据;如果存在就更新
- C语言:标记化结构初始化语法
- Angular2-PrimeNG 分页模块源码学习
- 根据推送消息 跳转到指定控制器
- Java-Card-技术简介
- Got error 28 from storage engine
- 矩阵的基本使用
- 一步步教你Hadoop多节点集群安装配置
- 阿里DataV 2016双十一媒体大屏回顾&技术分享
- Spring4 整合hibernate3报错问题