在linux核心源碼裡經常會見到以下這種類型的用法:
static struct platform_device androidusb_device = { .name = "android_usb", .id = -1, .dev = { .platform_data = &android_usb_pdata, }, };
這裡platform_device是定義好的一個結構題(在kernel/include/linux/platform_device.h中定義),androidusb_device是一個具體的裝置,括弧內的內容為結構提初始化。
platform_device的定義如下:
struct platform_device { const char * name; int id; struct device dev; u32 num_resources; struct resource* resource; const struct platform_device_id*id_entry; /* arch specific additions */ struct pdev_archdataarchdata; };
從網上搜了一下關於struct的介紹,大部分都只是很淺顯的介紹,有一篇文章不錯,摘取了一部分貼在這裡。
struct是C中重要的ADT。但是在一般講C的書中,往往只介紹了struct的定義、順序初始化及位域。本文將筆者曾經用到的、看到的知識點羅列出來,與大家分享。(http://hi.baidu.com/cjzswust/blog/item/d1d2191f5ddc481541341711.html)
為了方便後面的介紹,先定義一個struct類型:
struct User { int id; //id char name[100]; //user name char *home; //home directory int passwd; //password };
struct資料有3中初始化方法:順序,C風格及C++風格的亂序。
1)順序
這種方法很常見,在一般的介紹C的書中都有介紹。順序初始化的特點是: 按照成員定義的順序,從前到後逐個初始化;允許只初始化部分成員;在被初始化的成員之前,不能有未初始化的成員。
eg: struct User oneUser = {10, "Lucy", "/home/Lucy"}; 初始化之後,oneUser各個成員的值為: oneUser.id = 10; oneUser.name = "Lucy"; oneUser.home = "/home/Lucy"; oneUser.passwd = 0;
2)亂序(C風格)
順序的缺陷是必須按成員定義的順序逐個初始化,不能間隔。而亂序的方式則很好的解決了這個問題,因為這種方式是按照成員名進行。
eg: struct User oneUser = { .name = "Lucy", .id = 10, .home = "/home/Lucy" };
3)亂序(C++風格)
C++風格的亂序初始化方式跟C風格的一樣,只是它更常用在C++代碼裡。
eg: struct User oneUser = { name:"Lucy", id:10, home:"/home/Lucy" };
不論是哪種方式,都允許只初始化部分成員;未被初始化的成員預設為0(指標類型的成員預設為NULL)。兩種亂序初始化方法,即可以用在C代碼中,也可以用在C++代碼中。