您的位置:首页 > 其它

关于回调函数的本质及比喻和实例分析

2015-11-08 22:57 295 查看
#include <iostream>
using namespace std;

typedef void (*PF)();
void func()
{
cout << "func" << endl;
}

void caller( PF pf)
{
pf();
}

int main()
{
PF p = func;
caller(p);

system("pause");

return 0;
}


回调函数。高层调用了底层,底层反过来回调了顶层。lib用的是指针。回调函数是最终被调用的那个。


https://www.zhihu.com/question/19801131
来源2

链接:http://www.zhihu.com/question/19801131/answer/13005983

来源:知乎

你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。回答完毕。

code和data本质是一样的东西。调用指针和调用数据一样的

来源1

链接:http://www.zhihu.com/question/19801131/answer/17156023

来源:知乎

来到这里,其实已经没有什么好说的了。回调函数也就是是A让B做事,B做着做着,信息不够,不知道怎么做了,就再让外面处理。

比如排序,A让B排序,B会做排序,但排序需要知道哪个比哪个大,这点B自己不知道,就需要A告诉它。而这种判断那个大,本身是一种动作,既然C语言中不可以传进第一值的函数,就设计成传递第二值的函数指针,这个函数指针就是A传向B的信息,用来表示一个行为。这里本来A调用B的,结果B又调用了A告诉它的信息,也就叫callback。

自己总结
main调用了caller这个函数。但是caller用了main的p指针。p为回调函数。main调用了caller,但是caller执行中发现东西不够,又回访main中的func。这就叫回调。你去店里买东西。电话为回调函数。你调用了店员,店员后来发现有货了但是信息不够,就用回调函数电话号码响应了你原来的东西。
回调函数可以把调用者和被调用者分开,调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。
main不用知道caller调用了谁,main不知道func,他只是知道形式就好。
dll也是一种回调机制。
CALLBACK VOID callback_fun(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
TRACE("CallBack\n");//debug下运行控制台输出CallBack
}

void CTestCallBackDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
SetTimer(1,1000,(TIMERPROC)callback_fun);//每一秒回调一次
}


这个代码段里首先定义回调函数,然后定义一个被调用函数。主调函数是系统,也就是鼠标点击的时候。这样本质还是系统调用了回调函数。

如何调用

 使用回调函数,我们需要做三件事:
声明
定义
设置触发条件:在你的函数种把你的回调函数名称转化为地址作为一个参数,以便于系统调用。

声明和定义时应注意,回调函数由系统调用,所以可以认为它属于windows系统,不要把它当作你的某个类的成员函数。

回调函数是一个程序员不能显示调用的函数,通过将回调函数的地址传给调用者从而实现调用。回调函数是十分必要的,在我们想通过一个统一接口实现不同的内容,这时回调函数非常合适。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息