C 语言杂谈(二):回调函数(callback function)

今天我们来看看回调函数。准确的说,C 语言中没有“回调”,它们是使用函数指针实现的。我们可以通过两个示例来学习回调函数。


1. callback 例子一 (用来理解函数指针)

void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue();
}

int getNextRandomValue(void)
{
    return rand();
}

int main(void)
{
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    ...
}

在这里,populate_array 函数将函数指针作为其第三个参数,并调用它以获取用于填充数组的值。 我们编写了回调 getNextRandomValue,它返回一个随机值,并将指向它的指针传递给 populate_arraypopulate_array 将调用我们的回调函数 10 次,并将返回的值分配给给定数组中的元素。


2. callback 例子二 (学习当一些 event 发生时的回调)

这个例子是关于在发生某些 event 时可以调用注册回调。流程分为以下几步。

  1. 定义用于回调的函数类型

    typedef void (*event_cb_t)(const struct event *evt, void *userdata);
    
  2. 定义一个函数用来注册一个回调

    int event_cb_register(event_cb_t cb, void *userdata);
    
  3. 编写运行注册回调的代码

    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);
    ...
    
  4. 编写在事件分配器的内部的回调所存储在的结构体:

    struct event_cb {
        event_cb_t cb;
        void *data;
    };
    
  5. 执行一个回调

    struct event_cb *callback;
    
    ...
    
    /* Get the event_cb that you want to execute */
    
    callback->cb(event, callback->data);
    
发布了53 篇原创文章 · 获赞 21 · 访问量 8368

猜你喜欢

转载自blog.csdn.net/zztiger123/article/details/103668503