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_array
。 populate_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函数。 这将接受一个函数指针,然后将该地址存储在可以使用的地方。 之后当指定的事件被触发时,它将调用该函数。