我在C中有一个类似于函数覆盖的要求。我有2个设备具有不同的设备ID。我有一个只调用device_create(device_id)的进程。该进程不知道要调用哪个device_create。如果device_id与驱动程序的设备ID匹配,则执行device_create是设备的驱动程序。有没有办法在C中做到?
答案 0 :(得分:0)
如果您使用不同的共享对象(或dll)来实现该功能,您可以自己以编程方式处理此功能。您可以创建一个类似于结构的插件,并使用类似Command模式的内容。
不是很简单,但可以帮助您解决问题。
干杯。
答案 1 :(得分:0)
行。明白我仍然是标记,但暂时离开这篇文章。
进程启动时您不知道ID。附加硬件后,您会读取ID,并希望根据ID调用正确的功能但不直接使用ID?
我能想到的最简单的解决方案是使用函数指针数组:
void (*funs[3])(void) = {
&device_create100,
&device_create200,
NULL
};
但是,只有当你可以规范化ID以匹配数组的索引时。假设所有ID都在1000-1032范围内,这将是一个32长的函数指针数组,您可以使用ID - 1000
。
由于这种情况不太可能,您可以使用排序列表,二叉树,哈希表等进行查找。
struct node {
int (*fun)(void);
int id;
struct *node left;
struct *node right;
}
当然,假设您有一个相当大的可能ID列表,而switch
是不可能的。
老帖子。
函数指针怎么样:
int (*device_create)(int);
int device_create_init(int id)
{
switch (id) {
case 0x0a:
device_create = &device_create_100;
break;
case 0x0b:
device_create = &device_create_200;
break;
}
/* After first call, the now set device_create_xxx function will be
invoked on device_create() */
return device_create(id);
}
int main(void)
{
device_create = &device_create_init;
/* Loop */
return 0;
}