Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 调用绑定函数_C - Fatal编程技术网

C 调用绑定函数

C 调用绑定函数,c,C,我正在努力实现一些我在动态语言中很容易做到的事情,但不知道如何在C中做到 我有一个程序,需要根据用户给定的字符串调用不同的函数。每个函数都有自己的C文件 实现这一点的简单方法是将if else elseif与strcmp一起执行,并在匹配时调用每个函数 我想做一些更好的事情:在包含每个重要函数的每个C文件的末尾,添加一个“binding”调用,有点像这样: int my_action(char smth[]); bind_function("myaction", my_action); fu

我正在努力实现一些我在动态语言中很容易做到的事情,但不知道如何在C中做到

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

实现这一点的简单方法是将if else elseif与strcmp一起执行,并在匹配时调用每个函数

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

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)都可以管理它。它很少漂亮,而且往往是特定于平台的。然而,这是可行的。不是微不足道的可行,而是可行的。