• C语言中的回调函数



    C语言中通过函数指针实现回调函数(Callback Function)


    ====== 首先使用typedef定义回调函数类型 ====== 

    typedef void (*event_cb_t)(const struct event *evt, void *userdata);

    上面的语句表示event_cb_t类型函数范围值类型为void类型。


    ====== 定义并实现一个函数用于注册回调函数 ======

    int event_cb_register(event_cb_t cb, void *userdata);

    下面是注册回调函数my_event_cb的一个模板

    static void my_event_cb(const struct event *evt, void *data)
    {
        /* do stuff and things with the event */
    }
    
    ...
       event_cb_register(my_event_cb, &my_custom_data);
    ...
    


    在事件调度器( event dispatcher)中,常常将回调函数放在结构体中,

    struct event_cb {
        event_cb_t cb;
        void *data;
    };

    此时通过访问结构体成员变量调用回调函数

    struct event_cb *callback;
    
    ...
    
    /* Get the event_cb that you want to execute */
    
    callback->cb(event, callback->data);



    ====== 一个回调函数的例子 ======

    #include <stdio.h>
    
    struct event_cb;
    
    typedef void (*event_cb_t)(const struct event_cb *evt, void *user_data);
    
    struct event_cb
    {
        event_cb_t cb;
        void *data;
    };
    
    static struct event_cb saved = { 0, 0 };
    
    void event_cb_register(event_cb_t cb, void *user_data)
    {
        saved.cb = cb;
        saved.data = user_data;
    }
    
    static void my_event_cb(const struct event_cb *evt, void *data)
    {
        printf("in %s
    ", __func__);
        printf("data1: %s
    ", (const char *)data);
        printf("data2: %s
    ", (const char *)evt->data);
    }
    
    int main(void)
    {
        char my_custom_data[40] = "Hello!";
        event_cb_register(my_event_cb, my_custom_data);
    
        saved.cb(&saved, saved.data);
    
        return 0;
    }



    Refrences:

    [1] http://stackoverflow.com/questions/142789/what-is-a-callback-in-c-and-how-are-they-implemented


  • 相关阅读:
    Boys and Girls
    TVM: Expressions in Relay
    TVM: Pass Infrastructure
    计算机网络
    git tag 常用命令_02
    python3 异步并发编程
    git tag 常用命令_01
    XLA
    Harbor 企业级 Registry 服务器
    linux 中find命令忽略大小写进行查找
  • 原文地址:https://www.cnblogs.com/pangblog/p/3275570.html
Copyright © 2020-2023  润新知