C语言标记化结构初始化语法扫盲

     以前在学习C语言时听说过所谓的C语言标记化结构初始化语法,但当时出于偷懒就没有细究。最近学习Linux设备驱动,就对它的结构体初始化写法感到奇怪,所有的初始化代码都写清了变量名,并且变量名前面还有一个诡异的点。又遇到了,就查了一下,长见识了啊,此种初始化写法并不是什么特殊的代码风格,而是所谓的C语言标记化结构初始化语法(designated initializer),而且还是一个ISO标准。

#include <stdio.h>
#include <stdlib.h>

struct Snooy{
      int data;
      void (*func1)(char*);
      void (*func2)(char*);
      char name[100];
};

void func1(char *chp)
{
       printf("This is func1 test!\n>>%s\n",chp);
}

void func2(char *chp)
{
       printf("This is func2 test!\n>>%s\n",chp);
}

int main(void) 
{
     struct Snooy  val = {
            .data = 1024,
            .func2 = func2,
            .func1 = func1,
            .name = "Snooy test!"
     };

      val.func1("Hello test func1!");
      val.func2("Hello test func2!");
      return 0;
}


下面摘自网络的一段评论关于我的这个例子:

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

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

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

    这下算是整明白点了,原来这个规则有这些好处,看来我的C语言功底有待提高啊!孤陋寡闻啊!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工匠若水

看完有帮助?不妨贡献一根辣条~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值