【问题标题】:Function overriding in CC中的函数覆盖
【发布时间】:2014-02-26 11:25:31
【问题描述】:

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

【问题讨论】:

  • 放一些你试过的代码
  • 看看工厂模式。
  • 阅读lwn.net/Articles/444910 - “内核中面向对象的设计模式”,有 C 技术来创建接口并实现它们
  • 我不明白你在问什么。你的代码在哪里?在调用过程中,在设备中?这个电话是在什么情况下发出的? “进程不知道调用哪个 device_create。”.这个电话是怎么打的?覆盖应该在哪里?
  • 我同意这个问题需要大量澄清。尝试解释你正在做的事情的为什么 - 这将帮助人们给你有用的建议。设备驱动程序的代码如何加载到调用device_create()的进程中?

标签: c overriding abstraction


【解决方案1】:

如果您使用不同的共享对象(或 dll)来实现该功能,您可以自行以编程方式进行处理。您可以创建一个类似结构的插件并使用类似命令模式的东西。

不完全简单,但可以帮助您解决问题。

干杯。

【讨论】:

    【解决方案2】:

    好的。了解我仍然是标记,但现在离开这个帖子。

    进程启动时您不知道 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;
    }
    

    【讨论】:

    • 感谢您的回复。链表选项似乎解决了我的问题。如果没有解决,那么我会回答我遇到的问题。
    • 我打算写这样的东西:
    • @user3354961:作为一棵树,我假设 ;)。即使是排序数组也可以使用最简单的例程进行相当快速的查找。当涉及到链表时,您还可以考虑展开链表:en.wikipedia.org/wiki/Unrolled_linked_list 但如果这是一个静态列表,请仔细考虑 LL。如果同一设备很可能连续频繁地断开和重新连接,请考虑至少缓存最后一个 ID。对于静态数据,请考虑如下主题:stackoverflow.com/q/18335889/3278057
    • strcut device_t arr[] = { LIST_ENTRY(100, device_create100) LIST_ENTRY(200, device_create200) };有没有办法在我的驱动程序中使用 LIST_ENTRY 之类的宏 100 和驱动程序 200 并且它们都将成为这个全局数组的一部分?
    • @user3354961:我不太会再找你了。你想要一些像{ LIST_ENTRY(100), LIST_ENTRY(200), LIST_ENTRY(300) } 这样的宏来创建像{ &device_create_100, &device_create_200, &device_create_300 } 这样的东西?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多