在linux内核头文件中有如下pci_device_id结构体的定义

struct pci_device_id {
__u32 vendor, device;    /* Vendor and device ID or PCI_ANY_ID*/
__u32 subvendor, subdevice; /* Subsystem ID's or PCI_ANY_ID */
__u32 class, class_mask;    /* (class,subclass,prog-if) triplet */
kernel_ulong_t driver_data; /* Data private to the driver */
};

赋值时有时候是如下按结构体有七个成员赋值:

static struct pci_device_id epic_pci_tbl[] = {
{ 0x10B8, 0x0005, 0x1092, 0x0AB4, 0, 0, SMSC_83C170_0 },
{ 0x10B8, 0x0005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SMSC_83C170 },
{ 0x10B8, 0x0006, PCI_ANY_ID, PCI_ANY_ID,
PCI_CLASS_NETWORK_ETHERNET << 8, 0xffff00, SMSC_83C175 },
{ 0,}
};

但有时候又按结构体只有四个成员赋值:

static struct pci_device_id gx_chipset_tbl[] __initdata = {
{ PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY,
PCI_ANY_ID, PCI_ANY_ID },
{ PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520,
PCI_ANY_ID, PCI_ANY_ID },
{ PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510,
PCI_ANY_ID, PCI_ANY_ID },
{ 0, },
};

我的问题是:此结构体到底有几个成员?vendor, device中用逗号分隔,结构体定义中使用逗号的意义是他们各是一个成员吗?为什么上面两种结构体赋值都正确?

推荐图书

  • Linux系统管理技术手册(第2版)


1个回答

结构体有7个成员,理由:

int a, b;等效于int a; int b;

复制,结构体的成员声明之后,它有默认值,如果不赋值,那么便是默认值。

上面的代码中不赋值的原因是:后面三个结构体成员的值要在运行后确定。