C中的“callback”是什么,它们是如何实现的?

从我读过的内容来看,Core Audio在很大程度上依赖于callback(和C ++,但这是另一回事)。

我了解了设置一个被另一个函数调用的函数来完成一个任务的概念(类)。 我只是不明白他们是如何build立起来的以及他们是如何工作的。 任何例子,将不胜感激。

C中没有“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函数将函数指针作为第三个参数,并调用它来获取值来填充数组。 我们编写了callbackgetNextRandomValue ,它返回一个随机值,并将指针传递给populate_arraypopulate_array会调用我们的callback函数10次,并将返回的值赋给给定数组中的元素。

这里是C中callback的一个例子

假设你想写一些代码,允许在发生某些事件时注册callback函数。

首先定义用于callback的函数的types:

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

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

 int event_cb_register(event_cb_t cb, void *userdata); 

这是代码将看起来像注册callback:

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

在事件调度程序的内部,callback可以存储在如下的结构体中:

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

这就是执行callback的代码。

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

一个简单的回拨程序。 希望它能回答你的问题。

 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include "../../common_typedef.h" typedef void (*call_back) (S32, S32); void test_call_back(S32 a, S32 b) { printf("In call back function, a:%d \tb:%d \n", a, b); } void call_callback_func(call_back back) { S32 a = 5; S32 b = 7; back(a, b); } S32 main(S32 argc, S8 *argv[]) { S32 ret = SUCCESS; call_back back; back = test_call_back; call_callback_func(back); return ret; } 

C中的callback函数等同于指定在另一个函数中使用的函数参数/variables。 Wiki示例

在下面的代码中,

 #include <stdio.h> #include <stdlib.h> /* The calling function takes a single callback as a parameter. */ void PrintTwoNumbers(int (*numberSource)(void)) { printf("%d and %d\n", numberSource(), numberSource()); } /* A possible callback */ int overNineThousand(void) { return (rand() % 1000) + 9001; } /* Another possible callback. */ int meaningOfLife(void) { return 42; } /* Here we call PrintTwoNumbers() with three different callbacks. */ int main(void) { PrintTwoNumbers(&rand); PrintTwoNumbers(&overNineThousand); PrintTwoNumbers(&meaningOfLife); return 0; } 

函数调用PrintTwoNumbers中的函数(* numberSource)是一个从PrintTwoNumbers中“callback”/执行的函数,如代码运行时指定的那样。

所以,如果你有一个像pthread函数的东西,你可以指定另一个函数在实例化的循环内运行。

C中的callback通常使用函数指针和关联的数据指针来实现。 您将函数on_event()和数据指针传递给框架函数watch_events() (例如)。 当一个事件发生时,你的函数被调用你的数据和一些事件特定的数据。

callback也用于GUI编程。 GTK +教程在信号和callback的理论上有一个很好的部分。

这个维基百科文章在C中有一个例子。

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

通常这可以通过使用函数指针来完成,这是一个指向函数内存位置的特殊variables。 然后你可以用这个来调用具有特定参数的函数。 所以可能会有一个函数设置callback函数。 这将接受一个函数指针,然后将该地址存储在可以使用的地方。 之后当指定的事件被触发时,它将调用该函数。