如何使用 GObject 按名称调用函数?

Mar*_*cik 1 c gobject glib

我想使用 GObject 调用的函数如下所示:

char * some_object_fun(SomeObject *self, char *input);
Run Code Online (Sandbox Code Playgroud)

有没有好的方法来实现这一目标?我对一个优雅的解决方案非常感兴趣。

nem*_*equ 5

C 并不真正支持内省/反射,就像您来自 Python、PHP、Java 等语言时可能习惯的那样。

我不知道我会称其为“优雅”,但大多数操作系统都提供了一种获取公共符号地址的方法,因此如果您的符号是公共的,您可以使用它,将其转换为函数指针适当的类型,然后调用该函数。在 POSIX 上,相关函数称为dlopendlsym。在 Windows 上,LoadLibrary以及GetProcAddress.

你的标签提到了 GObject,所以这稍微简化了事情;您可以只使用g_module_openand 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);
Run Code Online (Sandbox Code Playgroud)

当然,还要加上一些错误处理,但您应该能够弄清楚该部分。