如何使用 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 上,相关函数称为 dlopendlsym。在 Windows、LoadLibraryGetProcAddress 上。

您的标签提到了 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);

当然还有一些错误处理,但您应该能够弄清楚这部分内容。