在閱讀gnu/linux核心**時,我 們會遇到一種特殊的結構初始化方式。該方式是某些c教材(如譚二版、k&r二版)中沒有介紹過的。這種方式稱為指定初始化(designated initializer)。下面我們看乙個例子,linux-2.6.x/drivers/usb/storage/usb.c中有這樣乙個結構體初始化 專案:
static struct usb_driver usb_storage_driver = ;
乍一看,這與我們之前學過的結構體初始化差距甚遠。其實這就是前面所說的指定初始化在linux裝置驅動程式中的乙個應用,它源自iso c99標準。以下我摘錄了c primer plus第五版中相關章節的內容,從而就可以很好的理解2.6版核心採用這種方式的優勢就在於由此初始化不必嚴格按照定義時的順序。這帶來了極大的靈活 性,其更大的益處還有待大家在開發中結合自身的應用慢慢體會。
已知乙個結構,定義如下
struct book ;
c99支援結構的指定初始化專案,其語法與陣列的指定初始化專案近似。只是,結構的指定初始化專案使用點運算子和成員名(而不是方括號和索引值)來標識具體的元素。例如,只初始化book結構的成員value,可以這樣做:
struct book surprise = ;
可以按照任意的順序使用指定初始化專案:
struct book gift = ;
正像陣列一樣,跟在乙個指定初始化專案之後的常規初始化專案為跟在指定成員後的成員提供了初始值。另外,對特定成員的最後一次賦值是它實際獲得的值。例如,考慮下列宣告:
struct book gift = ;
這將把值0.25賦給成員value,因為它在結構宣告中緊跟在author成員之後。新的值0.25代替了早先的賦值18.90。
有關designated initializer的進一步資訊可以參考c99標準的6.7.8節ininialization。
C語言的結構體
c語言中的基本資料型別有 整形 浮點型 字元型,復合資料型別 陣列。還有一種構造資料型別,叫 結構體 宣告結構體的形式 struct 結構體名 成員列表可以是c語言的任何資料型別,如 整形 浮點型 字元型 陣列,指標,結構體 共用體 列舉。宣告了乙個結構體,相當於構造了一種新的資料型別,此時系統並不...
c語言的結構體
1.結構體的概念 結構體是一種複合型資料型別,同屬於複合型資料型別的還有聯合體。結構體可以理解為是一種自定義型別,用於對其他資料型別 什麼int型,double型,float型等等 的打包。c語言中正是因為結構體的存在,使其 具有封裝性,可以基於物件導向思想來程式設計。2.結構體的宣告 定義 假設我...
C語言的結構體
舉例,乙個結構體的定義如下 typedef struct foo foo 如果直接對上面的結構体作sizeof 運算 printf d n sizeof foo 40 如果在成員名後面加上冒號,指定占用的bits數,可以節省結構體的大小,例如 typedef struct foo foo 可以使用下...