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,
},
},
},
};
与前一种写法不同的是,该写法可以显示指定要初始化的成员,并且不需要按顺序。我在网上查找了一些相关的资料,自己总结这些写法的要点如下:
从前面的写法及总结的要点来看,这种指定初始化的方式很灵活,可以将注意力仅仅集中于那些当前比较关心并需要初始化的字段,对于无关的字段可以忽略不处理。另外,由于在初始化时加入了字段名,所以相应的代码可读性较强,可非常清楚初始化的是那些字段,而不需要再需查找相应的结构体定义。
联系客服