博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
标记化结构初始化语法(C语言)
阅读量:5261 次
发布时间:2019-06-14

本文共 1511 字,大约阅读时间需要 5 分钟。

以前在看Linux代码时,就对它的结构体初始化写法感到奇怪,所有的初始化代码都写清了变量名,并且变量名前面还有一个诡异的点。最近学习Linux设备驱动,又遇到了,就查了一下,发现自己的知识果然纰漏不少,此种初始化写法并不是什么特殊的代码风格,而是所谓的C语言标记化结构初始化语法(designated initializer),而且还是一个ISO标准。

 

[cpp]
  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. struct operators   
  4. {   
  5.      void (*read1)(char *);   
  6.      void (*read2)(char *);   
  7.      void (*read3)(char *);   
  8.      int n;   
  9. };   
  10.    
  11. void read1(char *data)   
  12. {   
  13.      printf("read1: %s/n",data);   
  14. }   
  15. void read2(char *data)   
  16. {   
  17.      printf("read2: %s/n",data);   
  18. }   
  19. void read3(char *data)   
  20. {   
  21.      printf("read3: %s/n",data);   
  22. }   
  23.    
  24. int main()   
  25. {    //传统的初始化方法   
  26.      //struct operators my_op = {read1, read2, read3, 100};    //所谓的标记化结构初始化语法   
  27.      struct operators my_op = {.read2 = read2,   
  28.                                .read1 = read1,   
  29.                                .read3 = read3,   
  30.                                .n = 100};   
  31.      my_op.read1("wangyang");   
  32.      my_op.read2("wangyang");   
  33.      my_op.read3("wangyang");   
  34.      return 0;   
  35. }  

 

重点就在于main()函数中对my_op结构体的初始化语句,使用点加变量名进行初始化。用过python的人会马上感觉到这与关键字传参是多么的相似。

 

那它的好处在哪里呢?我想好处有三:

    首先,标记传参不用理会参数传递的顺序,正如我上面的例子表示的那样,我是先初始化了read2,然后再初始化了read1,程序员不用记忆参数的顺序;

    其次,我们可以选择性传参,在传统C语言顺序传参中,如果你只想对第三个变量进行初始化,那么你不得不给第一个, 第二个参数进行初始化,而有时候一个变量并没有很合适的默认值,而使用标记初始化法,你可以相当自由地对你有把握的参数进行初始化;

    第三,扩展性更好,如果你要在该结构体中增加一个字段,传统方式下,为了考虑代码修改量,你最好将新添加的字段放在这个结构体的最后面,否则你将要面对大量且无趣的修改,你可能觉得放在哪里没什么关系,但是我们都习惯了,姓名下面是性别,性别下面是年龄,接着是兴趣爱好,最后是事迹描述,如果年龄放在了最后面,难道不别扭么?!

 

有人提到,该种语法还有利于提高性能,木有感觉出来,我在这里就不谈这点了。

 

其实,该种初始化语法并不是什么新技术,新定义,它就是ISO C99的一个标准用法,也就是说99年就有了,再说Linus也不会去赶什么时髦的,据说C Primer Plus第五版中提到了这点,不过,我没有看过该书,遗憾,我是直接投入了面向对象的怀抱。

 

GCC有扩展标记化结构初始化语法,写法是下面这样的:

struct operators my_op = {read2 : read2, read1 : read1, read3 : read3,};

 

 

转自:

转载于:https://www.cnblogs.com/omenglvrong1/p/4363821.html

你可能感兴趣的文章
站立会议第四天
查看>>
如何快速掌握一门技术
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
vagrant 同时设置多个同步目录
查看>>
python接口自动化28-requests-html爬虫框架
查看>>
生成随机数的模板
查看>>
hdu 2093
查看>>
Mysql 数据库操作
查看>>
SQL表中的自连接定义与用法示例
查看>>
static关键字
查看>>
转:linux终端常用快捷键
查看>>
009.栈实现队列
查看>>
A-Softmax的总结及与L-Softmax的对比——SphereFace
查看>>
关于软件盘覆盖住布局
查看>>
Unity3D 控制物体移动、旋转、缩放
查看>>
UVa 11059 最大乘积
查看>>
UVa 12545 比特变换器
查看>>
数组分割问题求两个子数组的和差值的小
查看>>
10个著名的思想实验1
查看>>
composer 报 zlib_decode(): data error
查看>>