原创 C语言标记化结构初始化语法

2011-10-5 11:58 1743 2 3 分类: MCU/ 嵌入式
   在看Linux代码时,就对它的结构体初始化写法感到奇怪,所有的初始化代码都写清了变量名,并且变量名前面还有一个诡异的点。最近学习Linux设备驱动,又遇到了,就查了一下,发现自己的知识果然纰漏不少,此种初始化写法并不是什么特殊的代码风格,而是所谓的C语言标记化结构初始化语法(designated initializer),而且还是一个ISO标准。
代码举例如下:
#include <stdio.h> 
#include <stdlib.h> 

struct operators 
p;
     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; 
}
   重点就在于main()函数中对my_op结构体的初始化语句,使用点加变量名进行初始化。用过python或者Verilog的人会马上感觉到这与关键字传参是多么的相似。
   那它的好处在哪里呢?我想好处有三。
   (1)标记传参不用理会参数传递的顺序。正如我上面的例子表示的那样,我是先初始化了read2,然后再初始化了read1,程序员不用记忆参数的顺序;
   (2)可以选择性传参.在传统C语言顺序传参中,如果你只想对第三个变量进行初始化,那么你不得不给第一个,第二个参数进行初始化,而有时候一个变量并没有很合适的默认值,而使用标记初始化法,你可以相当自由地对你有把握的参数进行初始化;
   (3)扩展性更好,如果你要在该结构体中增加一个字段,传统方式下,为了考虑代码修改量,你最好将新添加的字段放在这个结构体的最后面,否则你将要面对大量且无趣的修改。
   有人提到,该种语法还有利于提高性能(通过安放经常使用的成员的指针在相同硬件高速存储行中),木有感觉出来,我在这里就不谈这点了。
   其实,该种初始化语法并不是什么新技术,新定义,它就是ISO C99的一个标准用法,也就是说99年就有了,再说Linus也不会去赶什么时髦的,据说C Primer Plus第五版中提到了这点:
    struct book surprise = { .value = 10.99 };
    可以按照任意的顺序使用指定初始化项目:
    struct book gift = {
        .value = 25.99, 
        .author = "James Broadfool", 
        .title = "Rue for the Toad",
    };
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1570367 2011-10-17 22:08

学习了,感谢博主!
相关推荐阅读
用户374929 2011-09-13 16:28
RTL行为级仿真、综合后门级功能仿真和时序仿真
数字电路设计中一般有源代码输入、综合、实现等三个比较大的阶段,而电路仿真的切入点也基本与这些阶段相吻合,根据适用的设计阶段的不同仿真可以分为RTL行为级仿真、综合后门级功能仿真和时序仿真。这种仿真轮廓...
用户374929 2011-08-29 10:34
Quartus+ModelSim后仿详细流程
困扰很久的问题终于解决了,鄙视一下骏龙给的文档,完全是误导,鄙视,再鄙视。1、在SETTING里把仿真工具设置成MODELSIM2、用QUARTUS综合布线,生成的网表文件.vo在quartus/si...
我要评论
1
2
关闭 站长推荐上一条 /3 下一条