Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;插件API设计困境_C++_C_Plugins - Fatal编程技术网

C++ C/C++;插件API设计困境

C++ C/C++;插件API设计困境,c++,c,plugins,C++,C,Plugins,我正在为解决方案设计一个C/C++插件体系结构,该解决方案由3个组件组成: 客户端级别 核心级别 可视化水平 所有这些级别都有与另一端相应插件对话的插件(即:客户端、磁盘插件与核心磁盘插件对话,也可能是可视化磁盘插件,但不与核心CPU插件对话) 现在,我想让插件的创建尽可能简单,所以我想到了以下几点:插件在共享库中实现,并在请求时加载,还有一组预定义的函数,如加载、卸载、命名等。。。组件加载插件共享库,查找这些函数,完成工作,卸载插件 现在,有一个头文件,如: plugin_client.h:

我正在为解决方案设计一个C/C++插件体系结构,该解决方案由3个组件组成:

  • 客户端级别
  • 核心级别
  • 可视化水平
  • 所有这些级别都有与另一端相应插件对话的插件(即:客户端、磁盘插件与核心磁盘插件对话,也可能是可视化磁盘插件,但不与核心CPU插件对话)

    现在,我想让插件的创建尽可能简单,所以我想到了以下几点:插件在共享库中实现,并在请求时加载,还有一组预定义的函数,如加载、卸载、命名等。。。组件加载插件共享库,查找这些函数,完成工作,卸载插件

    现在,有一个头文件,如:

    plugin_client.h:
    
    /***************************************************************************
     *             Methods that are exposed in a client side plugin            * 
     ***************************************************************************/
    PLUGIN_LOAD_STATUS load();
    PLUGIN_UNLOAD_STATUS unload(PLUGIN_UNLOAD_REQUEST reason);
    const char* name();
    void do_work();
    
    这让插件开发者明白,他需要实现上述功能,插件才能集成到系统的客户端组件中

    这里开始了一个难题:对于核心组件插件,也应该有一个非常相似(几乎相同)的头文件,对于可视化部分也是如此。问题来了:

    我该如何处理这种情况?我想到了两个解决方案:

  • 不同组件的所有插件的一个通用头文件,即:
    plugin.h
    和所有可以实现的功能都在其中,并附有注释,说明此方法应该在客户端、核心和可视化组件中实现。这样做的缺点是,所有东西都放在一个地方,很多不必要的东西都被不感兴趣的各方看到
  • 在每个插件的头文件上,所以:
    plugin\u client.h
    plugin\u core.h
    plugin\u vis.h
    ,插件开发者包括他想要的。这些插件有一个特殊的功能:
    intplugin_type()如果这是客户端、核心或可视化插件,则返回。这样做的缺点是信息重复
  • 请让我知道你是否有任何关于如何优雅地解决这个难题的想法


    谢谢,f.

    真的不必有重复的信息。特定于类型的标头是否包括一个基本标头,如下所示:

    plugin_base.h

    /***************************************************************************
     *             Methods that are exposed in a client side plugin            * 
     ***************************************************************************/
    PLUGIN_LOAD_STATUS load();
    PLUGIN_UNLOAD_STATUS unload(PLUGIN_UNLOAD_REQUEST reason);
    const char* name();
    void do_work();
    int plugin_type();
    
    plugin\u client.h:

    #include "plugin_base.h"
    void client_only_function();
    
    对于其他插件类型也完全相同