我理解在实现库程序员不知道的库的情况下
- 调用特定库 API(例如计时器 API)后,不同的客户端想要做什么
或 - 他们希望调用库 API 的目的是什么(例如,排序库、可用于不同类型数据的不同比较方法),
程序员在他的 API 中为函数指针提供了一个参数,这是回调函数的一个很好的用途。
我已阅读 this article关于回调,但我还是有点困惑。在事件处理的情况下,回调与普通函数调用有何不同?在我看来,它们类似于在 switch 语句中进行的普通函数调用,如下所示:
switch(eventType) {
case EventA: handleEventA(); break;
case EventB: handleEventB(); break;
...
}
“注册回调”与此有何不同,这样做有何优势?
最佳答案
使用回调的主要优点是您可以从较低软件级别的子例程调用较高软件级别中定义的子例程。
举个例子:
库函数fetchData
int fetchData(type1 arg1 , type2 arg2, ... , functionPointerType funcPointer)
假设 fetchData 从 HTTP 服务器获取数据。
现在假设图书馆的用户想要处理 fetchData 从 HTTP 服务器获取的数据
4.因此用户将定义一个函数handelData,其原型(prototype)匹配functionPointerType,并将指向该函数的指针传递给fetchData。
5.因此,无论何时 fetchData(下层子程序)从 HTTP 服务器获取内容,它都会将该数据传递给 handleData(上层子程序)
6.在我的高级子例程中,我可以处理从低级子例程传递的数据,比如基于内容类型或与该数据关联的任何其他属性。
如果我要使用在 switch 语句中进行的正常函数调用,那么该代码将进入 fetchData 本身,因此这不会为库的用户提供处理的灵 active 数据根据他的应用程序的需要。
使用回调的经典示例是 C(Linux) 中的信号处理
void takeAction(int signo)
{
printf("Recieved SIGKILL (kill -%d)\nExiting now...\n",signo);
exit(0);
}
int main()
{
signal(SIGINT,takeAction);
while(1)
{
printf("In Main...\n");
sleep(2);
}
}
此处应用程序可以根据应用程序的要求处理信号。
关于c - 回调与用于事件处理的条件函数调用有何不同和优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20427246/