什么是C语言中的"回调"?如何实现?
根据我的读物,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);