2017-08-07 3 views

Répondre

3

C ne supporte pas vraiment l'introspection/réflexion comme vous peut être utilisé pour si vous venez de quelque chose comme Python, PHP, Java, etc.

Je ne sais pas que je l'appellerais "élégant", mais la plupart des systèmes d'exploitation offrent un moyen d'obtenir l'adresse d'un symbole public, donc si votre symbole est public, vous pouvez l'utiliser, le lancer sur un pointeur de fonction du type approprié, puis appeler la fonction. Sur POSIX, les fonctions pertinentes sont appelées dlopen et dlsym. Sous Windows, LoadLibrary et GetProcAddress. Vos tags mentionnent GObject, ce qui simplifie un peu les choses; vous pouvez simplement utiliser et g_module_symbol (qui sont essentiellement des abstractions sur les fonctions que j'ai mentionnées ci-dessus).

Le code ressemblerait à quelque chose comme:

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); 

Plus quelques traitement des erreurs, bien sûr, mais vous devriez être en mesure de comprendre cette partie dehors.