C语言中的函数重写
我在C中有一个类似于函数重写的要求。我有两个不同设备ID的设备。我有一个只调用device\u create(device\u id)的进程。进程不知道要调用哪个设备。如果设备id与驱动程序的设备id匹配,则由设备的驱动程序执行设备创建。如果您使用不同的共享对象(或DLL)来实现此功能,您可以自己编程处理此功能,是否有方法在C中执行此操作?。您可以创建一个类似插件的结构,并使用类似命令模式的东西 不是很简单,但是可以帮助你解决问题C语言中的函数重写,c,overriding,abstraction,C,Overriding,Abstraction,我在C中有一个类似于函数重写的要求。我有两个不同设备ID的设备。我有一个只调用device\u create(device\u id)的进程。进程不知道要调用哪个设备。如果设备id与驱动程序的设备id匹配,则由设备的驱动程序执行设备创建。如果您使用不同的共享对象(或DLL)来实现此功能,您可以自己编程处理此功能,是否有方法在C中执行此操作?。您可以创建一个类似插件的结构,并使用类似命令模式的东西 不是很简单,但是可以帮助你解决问题 干杯。好的。我知道我还没完成,但现在就离开这篇文章吧 您不知道进
干杯。好的。我知道我还没完成,但现在就离开这篇文章吧 您不知道进程启动时的ID。连接HW时,您读取ID并希望根据ID调用正确的函数,但不直接使用ID 我能想到的最简单的解决方案是使用函数指针数组:
void (*funs[3])(void) = {
&device_create100,
&device_create200,
NULL
};
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;
}
但只有当您可以规范化ID以匹配数组的索引时,才可以。假设所有ID都在1000-1032范围内,这将是一个32长的函数指针数组,您可以在其中使用ID-1000
因为这不太可能,所以您可以求助于排序列表、二叉树、哈希表或类似的方法来进行查找
struct node {
int (*fun)(void);
int id;
struct *node left;
struct *node right;
}
当然,这是假设您有一个相当大的可能ID列表,并且开关是不可能的
老职位
那么函数指针呢:
void (*funs[3])(void) = {
&device_create100,
&device_create200,
NULL
};
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;
}
放一些你试过的代码看看工厂模式。读这篇文章-“内核中的面向对象设计模式”,这里有一些C技术来创建接口并实现它们。我不明白你的要求。你的密码在哪里?在呼叫过程中,在设备中?这个电话是在什么情况下发出的?“进程不知道要调用哪个设备。”。这个电话是怎么打的?我同意这个问题需要很多澄清。试着解释一下你为什么要这样做——这会帮助人们给你一些有用的建议。设备驱动程序的代码是如何加载到调用device\u create()
的进程中的?谢谢您的回复。链表选项似乎解决了我的问题。如果它不能解决问题,那么我会用我面临的问题来回答。我计划写这样的东西:@user3354961:我假设它是一棵树;)。即使使用最简单的例程,排序数组也可以提供相当快速的查找。当涉及到链表时,您也可以考虑展开链接列表:但是如果这是静态列表,请仔细考虑LL。也可以考虑缓存至少最后一个ID,如果可能是同一个设备被删除连接并频繁重新连接。对于静态数据,考虑这样的主题:SrCutDeice 100 [AR][]{ListSyle条目(200,DeVice SyrCeTe100)ListSurl条目(Deice,CurryCeReT200)};有没有一种方法可以让我在驱动程序100和驱动程序200中使用一些宏,比如LIST_条目,它们都将成为这个全局数组的一部分?@user3354961:我不太明白你的意思。您需要一些宏,如{LIST\u ENTRY(100)、LIST\u ENTRY(200)、LIST\u ENTRY(300)}
来创建类似{&device\u create\u 100、&device\u create\u 200、&device\u create\u 300}
?