例说回调函数
来源:互联网 发布:淘宝用户名可以更改吗 编辑:程序博客网 时间: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;
}
-------------- 完 --------------
- 例说回调函数
- .NET 回调函数
- 回调函数
- 回调函数
- 回调函数概念
- 回调函数
- 回调函数
- 回调函数
- 回调函数 相关
- delphi 回调函数
- 回调函数
- 回调函数
- 回调函数学习
- 回调函数
- 关于回调函数
- 透析回调函数
- 回调函数
- 什么是回调函数
- 随便聊几句关于UE3的Navigation Mesh
- RMAN备份基本用法
- 敏捷开发之测试
- 初识web服务器控件
- strDivide2.cpp字符串划分
- 例说回调函数
- CodeForces156B Suspects
- Linux线程-终止
- Oracle 版本查看及版本号说明
- 设计模式之外观模式
- Android系统框架详解
- 计算机网络----宽带速度kbps、KB、Mbps
- ogre无法读取中文路径的解决办法
- 将年月日时分秒都保存进数据库