在標準C中(C89)結構標準初始化是用{}來實始化,在C99的版本,採用了採用可讀性更強的標記化 初始化,這在LINUX內核和驅動很爲常見。
這是ISO C99的用法
C Primer 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,
};
這個聲明採用了標記化結構初始化語法。這種寫法是值得采用的,因爲它使驅動程序在結構的定義發生變化時更具有可移植性,並且使代碼更加緊湊且易讀。標記化的初始化方法允許對結構成員進行重新排列。在某些場合下,將頻繁被訪問的成員放在相同的硬件緩存行上,將大大提高性能。