功能覆盖C语言

时间:2014-02-26 11:25:31

标签: c override abstraction

我在C中有一个类似于函数覆盖的要求。我有2个设备具有不同的设备ID。我有一个只调用device_create(device_id)的进程。该进程不知道要调用哪个device_create。如果device_id与驱动程序的设备ID匹配,则执行device_create是设备的驱动程序。有没有办法在C中做到?

2 个答案:

答案 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;
}