猿问
下载APP

C中的“回调”是什么?它们是如何实现的?

从我所做的阅读中,Core Audio在很大程度上依赖于回调(和C ++,但这是另一个故事)。

我理解设置一个函数的概念(类型),该函数由另一个函数重复调用以完成任务。我只是不明白他们是如何设置以及他们如何工作的。任何例子将不胜感激。


aluckdog
浏览 46回答 3
3回答

倚天杖

C中没有“回调” - 不超过任何其他通用编程概念。它们是使用函数指针实现的。这是一个例子:void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)){&nbsp; &nbsp; for (size_t i=0; i<arraySize; i++)&nbsp; &nbsp; &nbsp; &nbsp; array[i] = getNextValue();}int getNextRandomValue(void){&nbsp; &nbsp; return rand();}int main(void){&nbsp; &nbsp; int myarray[10];&nbsp; &nbsp; populate_array(myarray, 10, getNextRandomValue);&nbsp; &nbsp; ...}这里,populate_array函数将函数指针作为其第三个参数,并调用它来获取用于填充数组的值。我们编写了回调getNextRandomValue函数,它返回一个random-ish值,并将指针传递给它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){&nbsp; &nbsp; /* do stuff and things with the event */}...&nbsp; &nbsp;event_cb_register(my_event_cb, &my_custom_data);...在事件调度程序的内部,回调可以存储在如下所示的结构中:struct event_cb {&nbsp; &nbsp; event_cb_t cb;&nbsp; &nbsp; void *data;};这就是执行回调的代码。struct event_cb *callback;.../* Get the event_cb that you want to execute */callback->cb(event, callback->data);

HUWWW

一个简单的回叫计划。希望它能回答你的问题。#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){&nbsp; &nbsp; printf("In call back function, a:%d \t b:%d \n", a, b);}void call_callback_func(call_back back){&nbsp; &nbsp; S32 a = 5;&nbsp; &nbsp; S32 b = 7;&nbsp; &nbsp; back(a, b);}S32 main(S32 argc, S8 *argv[]){&nbsp; &nbsp; S32 ret = SUCCESS;&nbsp; &nbsp; call_back back;&nbsp; &nbsp; back = test_call_back;&nbsp; &nbsp; call_callback_func(back);&nbsp; &nbsp; return ret;}
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答