什么是C语言中的"回调"?如何实现?

时间:2020-03-06 14:49:00  来源:igfitidea点击:

根据我的读物,Core Audio在很大程度上依赖于回调(和C ++,但这是另一回事)。

我了解设置功能的概念(某种程度上),该功能被另一个功能反复调用以完成任务。我只是不了解他们如何设置以及他们如何实际工作。任何示例将不胜感激。

解决方案

C语言中的回调通常使用函数指针和关联的数据指针来实现。我们将函数" on_event()"和数据指针传递给框架函数" watch_events()"(例如)。事件发生时,将使用数据和一些特定于事件的数据来调用函数。

回调也用于GUI编程中。 GTK +教程很好地介绍了信号和回调的理论。

通常,这可以通过使用函数指针来完成,函数指针是一个指向函数的内存位置的特殊变量。然后,我们可以使用它来调用带有特定参数的函数。因此,可能会有一个设置回调函数的函数。这将接受一个函数指针,然后将该地址存储在可以使用它的地方。之后,当触发指定事件时,它将调用该函数。

这篇Wikipedia文章在C中提供了一个示例。

一个很好的例子是,为增强Apache Web服务器而编写的新模块通过向其传递函数指针向主apache进程注册,以便将这些函数调回以处理Web页面请求。

在C语言中没有"回调"之类的就是任何其他通用编程概念。

它们是使用函数指针实现的。这是一个例子:

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_array。 populate_array将调用我们的回调函数10次,并将返回的值分配给给定数组中的元素。

这是C语言中的回调示例。

假设我们要编写一些代码,以便在发生某些事件时可以调用注册回调。

首先定义用于回调的函数类型:

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

现在,定义一个用于注册回调的函数:

int event_cb_register(event_cb_t cb, void *userdata);

这是注册回调的代码:

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);
...

在事件分配器的内部,回调可能存储在看起来像这样的结构中:

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);