调用绑定函数

 mks8896386 发布于 2023-02-08 18:47

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

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

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

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

int my_action(char smth[]);

bind_function("myaction", my_action);

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

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

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

1 个回答
  • 这是可能的,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;
        }
    }
    

    2023-02-08 18:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有