|
标准C的标记化结构初始化语法
在标准C中(C89)结构标准初始化是用{}来实始化,在C99的版本,采用了采用可读性更强的标记化实始化,这在LINUX内核和驱动很为常见。
这是ISOC99的用法
CPrimer Plus第五版中相关章节:
已知一个结构,定义如下
struct book {
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
C99支持结构的指定初始化项目,其语法与数组的指定初始化项目近似。只是,结构的指定初始化项目使用点运算符和成员名(而不是方括号和索引值)来标识具体的元素。例如,只初始化book结构的成员value,可以这样做:
struct book surprise = {
.value = 10.99
};
可以按照任意的顺序使用指定初始化项目:
struct book gift = {
.value = 25.99,
.author = "James Broadfool",
.title = "Rue for the Toad"
};
正像数组一样,跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值。例如,考虑下列声明:
struct book gift = {
.value = 18.90,
.author = "Philionna pestle",
0.25 //value=0.25
};
这将把值0.25赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值0.25代替了早先的赋值18.90。
有关designated initializer的进一步信息可以参考c99标准的6.7.8节Ininialization。
其中VC++ 6.0只支持C89初始化,GCC支持自己标记化或自己扩展初始化。这种初始化采用 .name = value.这样不需要按顺序排序,方便调整实义,在大结构最大程度防止错位的和调整定义带来不便。
struct name_str{
int data;
char name[120];
int num;
};
/* 标记式初始化,注意顺序不同,并可缺省 */
struct name_str str ={
.num = 100;
.name = "hxy";
};
/*C89 初始化 */
struct name_str str2 =
{
100,"Andrew Huang",-2
};
/* gcc 扩展初始化 */
struct name_str str3 =
{
name:"bluedrum";
data:-1
}
在Linux2.6内核中对结构体的定义形式发生了变化,不再支持原来的定义形式。
static struct file_operations test_ops = {
.open = test_open,
.read = test_read
.write = test——write,
};
这个声明采用了标记化结构初始化语法。这种写法是值得采用的,因为它使驱动程序在结构的定义发生变化时更具有可移植性,并且使代码更加紧凑且易读。标记化的初始化方法允许对结构成员进行重新排列。在某些场合下,将频繁被访问的成员放在相同的硬件缓存行上,将大大提高性能 |
|