我想使用 GObject 调用的那个函数看起来像下面这样:
char * some_object_fun(SomeObject *self, char *input);
有什么好的方法可以实现吗?我会对优雅的解决方案非常感兴趣。
最佳答案
如果您来自 Python、PHP、Java 等,C 并不像您习惯的那样真正支持内省(introspection)/反射。
我不知道我会称之为“优雅”,但大多数操作系统都提供了一种获取公共(public)符号地址的方法,所以如果你的符号是公共(public)的,你可以使用它,将它转换为一个函数适当类型的指针,然后调用该函数。在 POSIX 上,相关函数称为 dlopen
和 dlsym
。在 Windows 上,LoadLibrary
和 GetProcAddress
。
您的标签提到了 GObject,这样可以简化一些事情;你可以只使用 g_module_open
和 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);
当然还有一些错误处理,但您应该能够弄清楚这部分内容。
关于c - 如何使用 GObject 按名称调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45552208/