例说回调函数

来源:互联网 发布:淘宝用户名可以更改吗 编辑:程序博客网 时间:2024/06/09 19:02

 

本人甚愚!一个回调函数迷糊了我几天,汗、、、、、、、、、

网上找了若干解释,理解能力差,仍然云里雾里的飘。。。。。。。。郁闷要死~~~~~~~~~~~~~~~

要淡定,不就是个小回调吗,人家都能造出来,咱还不回用,说不过去

------深吸一口气----------

首先,咱不管那么多像绕口令似的名词解释,来点实际的,因为回调函数的功能就是定义好后供给别人、别的地方用。

所以一共就2个问题:哪儿实现(如何实现)?哪儿使用(如何使用)? 

 清楚吧,其它朦胧的地方等会用了再去理解吧(再说了,老板可能要的是进度,并不太关心你知识的细节)

 

=====好,开始 ================

 

Demo背景:一个exe工程,一个dll工程

目的:在dll工程中调用exe工程里实现的回调

因此,上面的2个问题很明显:

哪儿实现(如何实现)?答:在exe里实现

a) .h声名实现函数
b)  .cpp里定义实现
c)  .cpp里“设置回调接口”,即传函数地址到使用的地方(例中为dll)

哪儿使用(如何使用)? 答:在dll工程里使用

a)  .h中定义函数指针

b)  .h中声名“设置回调接口”
c)  .cpp中完成“设置回调接口”给定义的变量赋值(把传来的函数地址给某变量,备用)
d) .cpp中用成员变量夹带参数完成回调(此处的参数类型、个数应与实现的地方一致)

实现到使用的过程就是:先传函数地址(理解能力高的人称为函数指针),后使用

 

=====好,结束 ============= 就这么多,具体例子见资源中的demo

 

------------- 下面是网罗其它人对回调函数的解释 ------------------------------------------

什么是回调函数(callback)
    模块A有一个函数foo,它向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A

发生了什么事情,让A作出相应反应。 那么我们就把foo称为回调函数。

 

回调函数也是一个函数或过程,不过它是一个由调用方自己实现,供被调用方使用的特殊函数。

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用;同步调用是三者当中最简单的,而回调

又常常是异步调用的基础。

 void Func(char *s);// 函数原型
 void (*pFunc) (char *);//函数指针


许多编译器有几种调用规范。如在Visual C++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。C++

Builder也支持_fastcall调用规范。调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或

者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。 将调用规范看成是函数类型的一部分是很重要的;不能用不兼容的调用规范将地址赋值

给函数指针。


回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事:

1.          声明;statci int __stdcall MyAdd(int x, int y)

2.          定义;int MyAdd(intx, int y){(实现)}

3.          设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用。

声明和定义时应注意:回调函数可以作为类的成员函数,但必须声明为静态方法。


--------------
在其它类、模块使用时要先导出那个回调类型
如: typedef BOOL (CS_NVR_CALLBACK* CS_NVR_fpVMapReport)(LPMON_ITEM pStuMonItem, LPCAM_ITEM pStuCamItem, long lParam);中

CS_NVR_fpVMapReport就是回调函数的类型

 

--------------
下面是一个简单的回调函数,(我感觉我的demo更明了):

#include<stdio.h>
#include<stdlib.h>
void perfect(int n)
{
 int i=1;
    int count=0;
 for(i=1;i<n;i++)
 {
    
  if(0==n%i)
  {
   count+=i;
  }
 }
 if(count==n)
  printf("%d是完数\n",n);
 else printf("%d不是完数\n",n);
}
void myCallback(void (*perfect)(int ),int n)
{
 perfect(n);
}

int main()
{
 int n;
 printf("请输入一个正整数\n");
 scanf("%d",&n);

 myCallback(perfect,n);
 return 0;
 
}

-------------- 完 --------------

原创粉丝点击