我正在努力实现我在动态语言中轻松完成的任务,但不知道如何用C语言完成.
我有一个程序,需要根据用户给定的字符串调用不同的函数.每个函数都有自己的C文件.
执行此操作的简单方法是使用if-else-elseif和strcmp,并在匹配时调用每个函数.
我想做更好的事情:在每个C文件的末尾持有每个重要的函数,添加一个"绑定"调用,有点像这样:
int my_action(char smth[]); bind_function("myaction", my_action);
然后,在主程序中,能够查找"myaction"字符串的函数,如果存在,则调用它.
我认为它与将字符串映射到指向函数的指针有关.但是,老实说,我不知道它是否可能或从哪里开始.
在C中这样的事情可能吗?如果是,那么,我该怎么办呢?
这是可能的,Linux内核实现了这一点.例如,请参见MACHINE_START宏.但是,它非常适合平台,编译器和链接器.你不能用普通的标准C做到这一点.
在gcc下,我可以这样写:
struct function_binding { const char *name; int (*func)(char *); }; #define bind_function(binding_name, func_name) \ static \ __attribute__((section(".funcbind"))) \ __attribute__((used)) \ struct function_binding __##func_name##_binding = { \ .name = binding_name, .func = func_name \ } int test_func(char *x) {} bind_function("test_func", test_func);
这会将所有函数绑定放入一个名为的部分.funcbind
.然后,您需要编辑链接描述文件以添加如下内容:
function_binding_list = .; *(.funcbind); LONG(0); /* Terminate list */
在要遍历列表的文件中,您只需使用循环:
extern struct function_binding function_binding_list[]; struct function_binding *curr; for (curr = function_binding_list; curr->name != NULL; curr++) { if (!strcmp(curr->name, name)) { curr->func(args); break; } }