在阅读GNU/
Linux内核代码时,我 们会遇到一种特殊的结构初始化方式。这种方式称为
指定初始化(designated initializer)。下面我们看一个例子,Linux-2.6.x/drivers/usb/storage/usb.c中有这样一个结构体初始化 项目:
static struct usb_driver usb_storage_driver = {
.owner = THIS_MODULE,
.name = \"usb-storage\",
.probe = storage_probe,
.disconnect = storage_disconnect,
static struct usb_driver usb_storage_driver = {
.owner = THIS_MODULE,
.name = \"usb-storage\",
.probe = storage_probe,
.disconnect = storage_disconnect,
.id_table = storage_usb_ids, };
C99支持结构体的指定初始化项目,其语法与数组的指定初始化近似。只是,结构体的指定初始化项目使用点运算符和成员名来标识具体的元素。
例如,只初始化book结构体中的成员value,可以这样做:
struct value apple = {.value = 10.99};
可以按照任意的顺序使用初始化项目:
注意:
1. 结构体指定初始化时,用到的就是点运算符加变量名,不许要指明类型,程序会自动匹配。
2. 右边的值类型尽量要匹配左边的类型。
3. 初始化时,变量之间可以用逗号分开,也可以用分号分开。
4. 整个结构体外边不要忘记分号。
指定初始化的好处:内核采用这种方式的原因在于初始化时,不必严格按照定义时的顺序,这带来了极大的灵活性。