歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

linux驅動程序中的結構體成員前為什麼有一個點“.”?

原文地址http://blog.chinaunix.net/uid-29033331-id-3811134.html
在閱讀GNU/Linux內核代碼時,我們會遇到一種特殊的結構初始化方式。該方式是某些C教材(如譚二版、K&R二版)中沒有介紹過的。這種方式稱為指定初始化(designated
initializer)。下面我們看一個例子,Linux-2.6.x/drivers/usb/storage/usb.c中有這樣一個結構體初始化項目:
static structusb_driver usb_storage_driver = {
.owner= THIS_MODULE,
.name= \"usb-storage\",
.probe= storage_probe,
.disconnect= storage_disconnect,
.id_table= storage_usb_ids, };
乍一看,這與我們之前學過的結構體初始化差距甚遠。其實這就是前面所說的指定初始化在Linux設備驅動程序中的一個應用,它源自ISO C99標准。以下我摘錄了C
Primer Plus第五版中相關章節的內容,從而就可以很好的理解2.6版內核采用這種方式的優勢就在於由此初始化不必嚴格按照定義時的順序。這帶來了極大的靈活性,其更大的益處還有待大家在開發中結合自身的應用慢慢體會。已知一個結構,定義如下
struct book {
chartitle[MAXTITL];
charauthor[MAXAUTL];
floatvalue; };
C99支持結構的指定初始化項目,其語法與數組的指定初始化項目近似。只是,結構的指定初始化項目使用點運算符和成員名(而不是方括號和索引值)來標識具體的元素。例如,只初始化book結構的成員value,可以這樣做:
struct booksurprise = { .value = 10.99 };
可以按照任意的順序使用指定初始化項目:
struct book gift= {
.value= 25.99,
.author= \"James Broadfool\",
.title= \"Rue for the Toad\"};
正像數組一樣,跟在一個指定初始化項目之後的常規初始化項目為跟在指定成員後的成員提供了初始值。
Copyright © Linux教程網 All Rights Reserved