调用绑定函数

时间:2013-12-20 23:36:02

标签: c

我正在努力实现我在动态语言中轻松完成的任务,但却不知道如何用C语言完成。

我有一个程序需要根据用户给定的字符串调用不同的函数。每个函数都有一个自己的C文件。

执行此操作的简单方法是使用if-else-elseif和strcmp,并在每个函数匹配时调用它们。

我想做更好的事情:在每个C文件的末尾持有每个重要函数,添加一个“绑定”调用,有点像这样:

int my_action(char smth[]);

bind_function("myaction", my_action);

然后,在主程序中,能够查找“myaction”字符串的函数,如果存在,则调用它。

我认为它与将字符串映射到函数的指针有关。但是,老实说,我不知道它是否可能或从哪里开始。

在C中这样的事情可能吗?如果是,那我该怎么办呢?

1 个答案:

答案 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;
    }
}