我正在努力实现我在动态语言中轻松完成的任务,但却不知道如何用C语言完成。
我有一个程序需要根据用户给定的字符串调用不同的函数。每个函数都有一个自己的C文件。
执行此操作的简单方法是使用if-else-elseif和strcmp,并在每个函数匹配时调用它们。
我想做更好的事情:在每个C文件的末尾持有每个重要函数,添加一个“绑定”调用,有点像这样:
int my_action(char smth[]);
bind_function("myaction", my_action);
然后,在主程序中,能够查找“myaction”字符串的函数,如果存在,则调用它。
我认为它与将字符串映射到函数的指针有关。但是,老实说,我不知道它是否可能或从哪里开始。
在C中这样的事情可能吗?如果是,那我该怎么办呢?
答案 0 :(得分:7)
Linux内核可以实现这一点。例如,请参阅MACHINE_START macro。但是,它非常适合平台,编译器和链接器。你不能用普通的标准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;
}
}