今天我们来看看回调函数。准确的说,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_array
。 populate_array
将调用我们的回调函数 10 次,并将返回的值分配给给定数组中的元素。
2. callback 例子二 (学习当一些 event
发生时的回调)
这个例子是关于在发生某些 event
时可以调用注册回调。流程分为以下几步。
-
定义用于回调的函数类型
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);