C 调用绑定函数
我正在努力实现一些我在动态语言中很容易做到的事情,但不知道如何在C中做到 我有一个程序,需要根据用户给定的字符串调用不同的函数。每个函数都有自己的C文件 实现这一点的简单方法是将if else elseif与strcmp一起执行,并在匹配时调用每个函数 我想做一些更好的事情:在包含每个重要函数的每个C文件的末尾,添加一个“binding”调用,有点像这样:C 调用绑定函数,c,C,我正在努力实现一些我在动态语言中很容易做到的事情,但不知道如何在C中做到 我有一个程序,需要根据用户给定的字符串调用不同的函数。每个函数都有自己的C文件 实现这一点的简单方法是将if else elseif与strcmp一起执行,并在匹配时调用每个函数 我想做一些更好的事情:在包含每个重要函数的每个C文件的末尾,添加一个“binding”调用,有点像这样: int my_action(char smth[]); bind_function("myaction", my_action); fu
int my_action(char smth[]);
bind_function("myaction", my_action);
function_binding_list = .;
*(.funcbind);
LONG(0); /* Terminate list */
然后,在主程序中,能够查找函数中的“myaction”字符串,如果它存在,则调用它
我认为这与将字符串映射到函数指针有关。但是,老实说,我不知道这是否可能,也不知道从哪里开始
这在C语言中是可能的吗?如果是的话,我该怎么做呢?这是可能的,Linux内核实现了很多。请参见示例。然而,它是非常特定于平台、编译器和链接器的。你不能在普通的标准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
的部分中。然后,您需要编辑链接器脚本以添加如下内容:
int my_action(char smth[]);
bind_function("myaction", my_action);
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;
}
}
你能提供一些用这种动态语言编码的例子吗?@rullof:我现在没有任何“真实”的例子。但是,例如,可以考虑使用JS或PHP。函数可以分配给变量(var=function(){…}),然后这些变量可以分配给字典或数组。然后,很容易看到给定字符串是否有条目并调用它。您将字符串映射到指针的方法是正确的。在C++中,我只说使用<代码> STD::MAP< /Cord>。但是在C中,你可能必须创建自己的数据结构来存储这些值。YUP,我有一个关于如何在C++中做的小想法。但是我在这里对C感到困惑。我需要一些指针…不是字面上的…Perl、Python、Ruby、Tcl/Tk(甚至是Java和JNS)都可以管理它。它很少漂亮,而且往往是特定于平台的。然而,这是可行的。不是微不足道的可行,而是可行的。