您手头应该有Linux 内核源代码才能真正理解这一点。
在MODULE_DEVICE_TABLE(参见Hard time in understanding MODULE_DEVICE_TABLE(usb, id_table) usage)和定义usb_driver结构的实例时,它是必需的,参见http://opensourceforu.efytimes.com/2011/11/usb-drivers-in-linux-2/。
USB_DEVICE是include/linux/usb.h中定义的宏:
#define USB_DEVICE(vend, prod) \
.match_flags = USB_DEVICE_ID_MATCH_DEVICE, \
.idVendor = (vend), \
.idProduct = (prod)
C 标准说:
初始化应按初始化列表顺序进行,每个
为覆盖任何特定子对象提供的初始化程序
先前列出的相同子对象的初始化程序;所有子对象
未显式初始化的将被隐式初始化
与具有静态存储持续时间的对象相同。
和:
如果具有自动存储持续时间的对象未初始化
明确地说,它的值是不确定的。如果一个物体有静电
存储时长未显式初始化,则:
- 如果有指针类型,则初始化为空指针;
- 如果它具有算术类型,则初始化为(正数或
无符号)零;
- 如果是聚合,每个成员都被初始化(递归)
根据这些规则;
- 如果是联合,则初始化第一个命名成员
(递归地)根据这些规则。
因此,id_table 被定义为指针,而不是usb_driver 中的数组:
const struct usb_device_id *id_table;
使用id_table 的函数不会单独传递数组大小,而是递增指向id_table 的指针,直到其中一个元素为NULL。请参阅代表此技术的简短示例:
#include <stdio.h>
#include <stdlib.h>
struct small
{
int a;
int b;
};
struct big
{
struct small *s;
};
struct small table[] =
{
{1, 1},
{2, 2},
{3, 3},
{}
};
int main(void)
{
struct big b = {
.s = table
};
const struct small *s;
/* traverse through table using pointer arithmetic */
for (s = b.s; s->a; s++)
{
printf("%d\n", s->a);
printf("%d\n", s->b);
}
exit(0);
}
- 我尝试以这种方式初始化设备 ID 表,但我得到了
接近初始化的错误
我没有,你确定你不是要重新定义pen_table吗?什么是错误信息?