如何使用 GObject 按名称调用函数?
How to call a function by name using GObject?
我想使用 GObject 调用的函数如下所示:
char * some_object_fun(SomeObject *self, char *input);
有什么好的方法可以实现吗?我会对优雅的解决方案非常感兴趣。
C 并不真正支持 introspection/reflection,如果您来自 Python、PHP、Java 等,您可能已经习惯了。
我不知道我会称它为 "elegant",但大多数操作系统都提供了一种获取 public 符号地址的方法,所以如果你的符号是 public 你可以使用它,将它转换为适当类型的函数指针,然后调用该函数。在 POSIX 上,相关函数称为 dlopen
和 dlsym
。在 Windows、LoadLibrary
和 GetProcAddress
上。
您的标签提到了 GObject,这样可以简化一些事情;你可以只使用 g_module_open
and g_module_symbol
(这基本上是我上面提到的函数的抽象)。
代码看起来像这样:
char* (* sym)(SomeObject*, char*);
GModule* module = g_module_open(NULL, 0);
sym = g_module_symbol("some_object_fun");
sym(instance, input);
g_module_close(module);
当然还有一些错误处理,但您应该能够弄清楚这部分内容。
我想使用 GObject 调用的函数如下所示:
char * some_object_fun(SomeObject *self, char *input);
有什么好的方法可以实现吗?我会对优雅的解决方案非常感兴趣。
C 并不真正支持 introspection/reflection,如果您来自 Python、PHP、Java 等,您可能已经习惯了。
我不知道我会称它为 "elegant",但大多数操作系统都提供了一种获取 public 符号地址的方法,所以如果你的符号是 public 你可以使用它,将它转换为适当类型的函数指针,然后调用该函数。在 POSIX 上,相关函数称为 dlopen
和 dlsym
。在 Windows、LoadLibrary
和 GetProcAddress
上。
您的标签提到了 GObject,这样可以简化一些事情;你可以只使用 g_module_open
and g_module_symbol
(这基本上是我上面提到的函数的抽象)。
代码看起来像这样:
char* (* sym)(SomeObject*, char*);
GModule* module = g_module_open(NULL, 0);
sym = g_module_symbol("some_object_fun");
sym(instance, input);
g_module_close(module);
当然还有一些错误处理,但您应该能够弄清楚这部分内容。