zoukankan      html  css  js  c++  java
  • C语言标记化结构初始化语法

       C语言标记化结构初始化语法 (designated initializer),而且还是一个ISO标准。

    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,};

  • 相关阅读:
    BZOJ 3744 Gty的妹子序列
    BZOJ 3872 Ant colony
    BZOJ 1087 互不侵犯
    BZOJ 1070 修车
    BZOJ 2654 tree
    BZOJ 3243 向量内积
    1003 NOIP 模拟赛Day2 城市建设
    CF865D Buy Low Sell High
    CF444A DZY Loves Physics
    Luogu 4310 绝世好题
  • 原文地址:https://www.cnblogs.com/oracleloyal/p/5378542.html
Copyright © 2011-2022 走看看