網址:http://blog.chinaunix.net/uid-24807808-id-3219820.html
在看linux源碼的時候,經常會看到類似於下面的結構體賦值的代碼:
- struct device my_dev =
- {
- .bus = &my_bus_type,
- .parent = &my_bus,
- .release = my_dev_release,
- };
整體上看,貌似與我們平時遇到的結構題賦值差不多,可是在變量前面加了一個點,好像我們就不知道是什么意思了。
上面的這種賦值方式成為指定初始化(designated initializer)。源自ISO C99標准。
C Primer Plus有比較詳細的描述,如下:
已知一個結構體定義:
點擊(此處)折疊或打開
struct book
{
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
{
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
C99支持結構體的指定初始化項目,其語法與數組的指定初始化近似。只是,結構體的指定初始化項目使用點運算符和成員名來標識具體的元素。
例如,只初始化book結構體中的成員value,可以這樣做:
struct book a = {.value = 10.99};
可以按照任意的順序使用初始化項目:
點擊(此處)折疊或打開
- struct book gift =
- {
- .value = 25.90,
- .author = "Li Cong",
- .title = "Love Linux",
- };
和數組一樣,跟在一個制定初始化項目之后的常規初始化項目為跟在指定成員后的成員提供了初始值。另外,對特定成員的最后一次賦值是它實際獲得的值。例如:
struct book gift =
{
.value = 18.90,
.author = "Li Cong",
20.0
};
{
.value = 18.90,
.author = "Li Cong",
20.0
};
這將把值20.0賦給成員value,因為它在結構聲明中緊跟在author成員之后。新的值20.0代替了早先的賦值18.90。
注意:
1. 結構體指定初始化時,用到的就是點運算符加變量名,不許要指明類型,程序會自動匹配。
2. 右邊的值類型盡量要匹配左邊的類型。
3. 初始化時,變量之間可以用逗號分開,也可以用分號分開。
4. 整個結構體外邊不要忘記分號。
內核采用這種方式的原因在於初始化時,不必嚴格按照定義時的順序,這帶來了極大的靈活性。