打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C99标准的结构体指定初始化

                enum AccessAttr      attr;                 
                enum ConfigType       type;                
                enum ConfigDispAttr  displayAttr;         

                unsigned long   offset;                  
                unsigned long   len;                     
                unsigned long   mask;                     
                unsigned long   defaultValue;             

                struct                                   
                {
                    unsigned long  value;                
                    char  *        desc;                 
                    enum AccessAttr     atr;             
                }listValue[CONFIG_INFO_MAX_STATE];
            }item[FLASH_CONFIG_MAX_ITEM];
        }group[FLASH_CONFIG_MAX_GROUP];
    }tag[FLASH_CONFIG_MAX_TAG];
};

  在定义这个结构体之后,我们使用其定义一个变量。通常定义的写法如下:

struct ConfigInfo info = {
    “info name”,
     {
          “tagname”,
          {

              “group name”,
              {
                   “item name”,
                    “item desc”,
                      ………省略…
              },
          },
     },
};

  这种写法的特点是:必须完全按结构体中各字段字义的顺序逐个初始化,不允许跳过其中字段。而在C99中,允许另一种初始化的写法:

struct FlashConfigInfo CFG1=
{
    .name = "Config",

    .tag[0] = {
        .name           = "Read Protection",
        .desc           = "Read Protection",
        .type           = Tag,

        .group[0]           = {
            .name           = "Read Protection",
            .desc           = "Read Protection",

            .item[0]           = {
                 .name          = "Option",
                 .desc          = "Read Protection",
                 .displayAttr   = CheckData,
                 .offset        = 0x00,
                 .len           = 1,
                 .mask          = 0xFF,
                 .defaultValue  = 0xA5,
            },
        },
    },
};

  与前一种写法不同的是,该写法可以显示指定要初始化的成员,并且不需要按顺序。我在网上查找了一些相关的资料,自己总结这些写法的要点如下:

  • 使用.字段名=值 初始化特定的字段,例如:.name = "Config";
  • 结构体中各个字段的初始化顺序可任意:即.name的初始化即可放在.tag[0]之间(如上所示),也可放在.tag[0]后面;
  • 支持嵌套结构体的初始化:如在.tag[0]下包含了子结构体,在初始化子结构体时,可使用该子结构体中的字段名初始化,如.type=Tag;
  • 对于包含数组的结构,可使用.数组名[数组索引]初始化,如.tag[0] = …;
  • 对于不需要初始化的字段,可简单的省略不写即可,如省略的.tag[0].item[0].attr。

  从前面的写法及总结的要点来看,这种指定初始化的方式很灵活,可以将注意力仅仅集中于那些当前比较关心并需要初始化的字段,对于无关的字段可以忽略不处理。另外,由于在初始化时加入了字段名,所以相应的代码可读性较强,可非常清楚初始化的是那些字段,而不需要再需查找相应的结构体定义

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C语言结构体占用空间内存大小解析
中国linux公社 - 基于atmel at91rm9200的armlinux的bootloader启动代码分析
Linux Regulator Framework(1)
一文搞懂 | Linux pinctrl/gpio子系统
uClinux cmdline分析以及rootfs挂载
使Uboot支持zImage引导
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服