Как вызвать функцию по имени, используя GObject?
Эта функция, которую я хочу вызвать с помощью GObject, выглядит следующим образом:
char * some_object_fun(SomeObject *self, char *input);
Есть ли хороший способ добиться этого? Я был бы очень заинтересован в элегантном решении.
1 ответ
C на самом деле не поддерживает интроспекцию / рефлексию, как вы привыкли, если вы работаете с чем-то вроде Python, PHP, Java и т. Д.
Я не знаю, что я бы назвал это "элегантным", но большинство операционных систем предлагают способ получить адрес публичного символа, поэтому, если ваш символ общедоступен, вы можете использовать его, приведя его к указателю на функцию соответствующий тип, затем вызовите функцию. В 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);
Плюс некоторая обработка ошибок, конечно, но вы должны быть в состоянии понять эту часть.