回调函数

Posted jiangyu0331

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回调函数相关的知识,希望对你有一定的参考价值。

一、什么是回调

  软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

二、C语言中的回调

  回调在C语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数从而实现回调。因此,要实现回调,必须首先定义函数指针:

  void func(char *s); //函数原型
  void (*pfunc)(char *); //函数指针

  一般为了简化函数指针类型的变量定义,提高程序的可读性,我们需要把函数指针类型自定义一下。

  typedef void(*pcb)(char *);

  回调函数可以像普通函数一样被程序调用,但是只有它被当作函数参数给被调函数时才能称作回调函数。

  例:   

void GetCallBack(pcb callback)
{
  /*do something*/
}
用户在调用上面的函数时,需要自己实现一个pcb类型的回调函数:
void fCallback(char *s) 
{
  /* do something */
} 
然后,就可以直接把fCallback当作一个变量传递给GetCallBack,
GetCallBack(fCallback);

  

以上是关于回调函数的主要内容,如果未能解决你的问题,请参考以下文章

满足条件时是不是可以在 GLSL 着色器中回调 C/C++ 函数/代码? [关闭]

ios block和delegate的区别

前端片段整理

通过DOM元素数据集将回调传递给js

对onActivityCreated片段回调有啥误解吗?

从片段替换片段时,onRequestPermissionsResult 回调不起作用