c - 回调与用于事件处理的条件函数调用有何不同和优势?

标签 c callback event-handling function-pointers

我理解在实现库程序员不知道的库的情况下

  1. 调用特定库 API(例如计时器 API)后,不同的客户端想要做什么
  2. 他们希望调用库 API 的目的是什么(例如,排序库、可用于不同类型数据的不同比较方法),

程序员在他的 API 中为函数指针提供了一个参数,这是回调函数的一个很好的用途。

我已阅读 this article关于回调,但我还是有点困惑。在事件处理的情况下,回调与普通函数调用有何不同?在我看来,它们类似于在 switch 语句中进行的普通函数调用,如下所示:

switch(eventType) {
    case EventA: handleEventA(); break;
    case EventB: handleEventB(); break;
    ...
} 

“注册回调”与此有何不同,这样做有何优势?

最佳答案

使用回调的主要优点是您可以从较低软件级别的子例程调用较高软件级别中定义的子例程。

举个例子:

  1. 库函数fetchData

    int fetchData(type1 arg1 , type2 arg2, ... , functionPointerType funcPointer)

  2. 假设 fetchData 从 HTTP 服务器获取数据。

  3. 现在假设图书馆的用户想要处理 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/

相关文章:

javascript - 如果手动切换翻转开关,如何仅触发事件

c - C 中的这个附加函数有什么问题

c - C 代码与机器/编译器相关的段错误

c - 在 Linux 中的多个独立程序之间共享相同的变量

c# - Moq - 设置模拟到第一次回调和第二次引发事件

ruby-on-rails - Rails的skip_callback如果条件不起作用

javascript - 如何使用 Firebug 或类似工具调试 JavaScript/jQuery 事件绑定(bind)?

c - mmap 中的无效参数

javascript - 删除重复的错误处理代码Node.js

event-handling - 防止 wxPython 事件命中多个窗口?