在不影响现有C或c++应用程序设计的情况下添加新的职责

Addition of new responsibilities without impacting existing design of a C or C++ application

本文关键字:情况下 程序设计 添加 应用 c++ 影响      更新时间:2023-10-16

我有组件负责接收消息和的需求处理消息。应该有一个通用的消息接口,如uint8数组(它是一个二进制消息)和一个通用框架,从外部配置文件中读取,一个处理程序列表。处理程序应该实现一个通用接口,例如:-

uint8[] process(uint8[] message);

每个处理程序应该处理消息并将处理后的消息返回给框架,以便框架可以将处理后的消息传递给下一个处理程序,依此类推。这种方法的美妙之处在于,它允许通过在配置文件中添加新的处理程序来添加新的功能(希望是在运行时)。泛型框架应该初始化新的处理程序,将其放在相应的处理程序位置,并通过所有处理程序传递消息。

我已经在Java中多次实现了这种方法,但我正在努力在C和c++中实现它。例如,在C中,我想也许通过一个指向框架的函数指针来注册每个处理程序的进程函数,这样框架就可以将消息传递给每个处理程序。但我不知道如何初始化基于配置文件的处理程序。配置文件将包含处理程序的"字符串"名称。main方法如何将字符串名称映射到处理程序文件?

如果你的配置文件这样说:

handler1.so
handler2.so
handler3.so

如果你在Linux平台上,你可以这样做:

void *lib = dlopen(name, RTLD_NOW);
typedef uint8* (handler_t)(uint8*);
handler_t *func = (handler_t*)dlsym("handler");

表示配置文件中的每个名称。这将动态加载一个共享库,其中每个库都包含一个处理函数(名为"handler")。

对于其他操作系统,存在类似的功能(例如Windows上的LoadLibrary用于*.dll)。

对于C,您有两个选择。

一种是使用dlsym()或其等效函数来查找与指定为字符串的函数名对应的函数指针。

另一种是使用预先确定的名称数组和相应的函数指针。如果接口不同(尽管dlsym()也有问题),这会变得混乱。

struct func_name
{
    const char *name;
    uint8   (*function)(void);
};
static const struct func_name func_list[] =
{
    { "function1",       function1       },
    { "anotherfunction", anotherfunction },
};
然后,您可以使用搜索(可能是二进制搜索,如果您保持名称顺序,不像我的示例)来查找与名称对应的函数指针。与dlsym()查找相比,这种技术的一个优点是数组中的名称不必与函数名称匹配,因此如果有意义,可以提供别名。
相关文章: