请问什么叫做回调函数

2024-05-17

1. 请问什么叫做回调函数

回调函数就是callback函数。是系统给用户的开放接口程序。
当某事件发生时,系统需要处理这一事件,例如键盘输入事件发生,例如屏幕图像更新事件发生,如果你给了“回调函数”,系统则用你给的程序去处理,如果没给,系统就用默认方法处理。
OpenGL 的 GLUT 程序就是这样。例如函数:
glutDisplayFunc(display); 这里的display就是你写的如何“画”屏幕的函数名。
glutKeyboardFunc(press_s); 这里的press_s就是你写的如何处理键盘输入事件的函数名。
函数的参数,系统也许有约定,也许允许你写一大串。
具体的display函数和press_s用户要提供。例如:
void display()
{
float v[3],n[3]; float text_color[3]={1.,0.,0.};
int i,j;
Point p1,p2,p3,p4;
glMatrixMode(GL_MODELVIEW);
glClearColor(1.0,1.0,1.0,1.0);
glClear(GL_COLOR_BUFFER_BIT);
glDrawBuffer(GL_BACK);
glMaterialfv(GL_FRONT, GL_AMBIENT,  mat1_ambient);
glPushMatrix();
glBegin(GL_TRIANGLES);
。。。。
}
void press_s(unsigned char key, int x, int y)
{
FILE * fout;
int bmp_w,bmp_v, win_buff_size;
...
 switch (key)
{ case 'q' :  exit (1); break;
case 'x': glTranslatef(10.,0.,0.); glutPostRedisplay();
...
}

请问什么叫做回调函数

2. 什么是回调函数麻烦告诉我

其实,回调函数大多只是自己定义一个名字而已,函数体大多是系统定义好的,它有一个结构,一般一个代回调函数的的函数都有一个参数是接你的回调名的,它把一些值传进回调函数(函数体包括参数是它预定好的,不能自己写,除非全部函数都是你写的),然后回调函数接受值,相应操作后将值返回到原函数体(它的父亲函数),最终让原函数返回一个值
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。至于如何定义回调函数,跟具体使用的API函数有关,一般在帮助中有说明回调函数的参数和返回值等。C++中一般要求在回调函数前加CALLBACK(相当于FAR PASCAL),这主要是说明该函数的调用方式。
至于钩子函数,只是回调函数的一个特例。习惯上把与SetWindowsHookEx函数一起使用的回调函数称为钩子函数。也有人把利用VirtualQueryEx安装的函数称为钩子函数,不过这种叫法不太流行。
也可以这样,更容易理解:回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事:
1.声明;
2.定义;
3.设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用。
声明和定义时应注意:回调函数由系统调用,所以可以认为它属于WINDOWS系统,不要把它当作你的某个类的成员函数
回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。回调函数使用是必要的,在我们想通过一个统一接口实现不同的内容,这时用回掉函数非常合适。比如,我们为几个不同的设备分别写了不同的显示函数:void TVshow(); void ComputerShow(); void NoteBookShow()...等等。这是我们想用一个统一的显示函数,我们这时就可以用回掉函数了。void show(void (*ptr)()); 使用时根据所传入的参数不同而调用不同的回调函数。
不同的编程语言可能有不同的语法,下面举一个c语言中回调函数的例子,其中一个回调函数不带参数,另一个回调函数带参数。
例子1://Test.c
#include<stdlib.h#include<stdio.hintTest1(){inti;for(i=0;i<30;i++){printf(
The%dthcharactoris:%c
,i,(
char)('a'+i%26));}return0;}intTest2(intnum){inti;for(i=0;i<num;i++){printf(
The%dthcharactoris:%c
,i,(
char)('a'+i%26));}return0;}voidCaller1(void(*ptr)())//指向函数的指针作函数参数{(*ptr)();}voidCaller2(intn,
int(*ptr)())//指向函数的指针作函数参数,这里第一个参数是为指向函数的指针服务的,//不能写成voidCaller2(int(*ptr)(intn)),这样的定义语法错误。{(*ptr)(n);return;}intmain(){printf(
************************);Caller1(Test1);//相当于调用Test2();printf(
&&&&&&************************);Caller2(30
,Test2);//相当于调用Test2(30);return0;}
以上通过将回调函数的地址传给调用者从而实现调用,但是需要注意的是带参回调函数的用法。要实现回调,必须首先定义函数指针。函数指针的定义这里稍微提一下。比如:

3. 什么叫回调函数

帮您查了一下,如下:
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
回调方法 是 任何一个 被 以该回调方法为其第一个参数 的 其它方法 调用 的方法。很多时候,回调是一个当某些事件发生时被调用的方法。

什么叫回调函数

4. 什么是回调函数,如何写一个回调函数

什么是回调函数?
  回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。
  理解回调函数!
  程序在调用一个函数(function)时(通常指api).相当于程序(program)呼叫(Call)了一个函数(function)关系表示如下:
  call(调用)
  program --------------------→ dll 
  程序在调用一个函数时,将自己的函数的地址作为参数传递给程序调用的函数时(那么这个自己的函数称回调函数).需要回调函数的 DLL 函数往往是一些必须重复执行某些操作的函数.关系表示如下:
  call(调用)
  program --------------------→ dll
  ↑ ¦
  ¦_______________________________¦
  callback(回调)
  当你调用的函数在传递返回值给回调函数时,你就可以利用回调函数来处理或完成一定的操作。至于如何定义自己的回调函数,跟具体使用的API函数有关,很多不同类别的回调函数有各种各样的参数,有关这些参数的描述一般在帮助中有说明回调函数的参数和返回值等.其实简单说回调函数就是你所写的函数满足一定条件后,被DLL调用!
  也有这样的说法(比较容易理解):
  回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事:
  1. 声明;
  2. 定义;
  3. 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用。

5. 什么情况下使用回调函数

简而言之,
就是一个通过
调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是
。 
为什么要使用
? 
因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。 
如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些
的实现,如
、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种
(int、float、string),此时,该怎么办呢?可以使用
,并进行回调。 
回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的
,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上,SetTimer() API使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的
。 
另一个使用回调机制的
是EnumWindow(),它枚举屏幕上所有的顶层窗口,为每个窗口调用一个程序提供的函数,并传递窗口的处理程序。如果被调用者返回一个值,就继续进行迭代,否则,退出。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。 
不管怎么说,回调函数是继续自C语言的,因而,在C++中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或函数符(functor),而不是回调函数。

什么情况下使用回调函数

6. 回调函数

callback 就是回电话

回调函数就是一个通过函数指针调用的函数。 函数指针=电话号码,函数=回电话callback

如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

如果把甲告诉乙电话号码,然后乙给甲回电话,肯定要用甲的电话号码吧,也就是上面说的云里雾里那句当这个指针被用为调用它所指向的函数时,所以回电话就是回调函数

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

就是不是甲无聊让乙回话,特定事件条件发生,比如甲被人揍了,其实真正调用的是揍人的

回调的好处就是1是回调函数通用,乙不用知道甲是被偷了被揍了被抢了,只要有号码回电话就行了,参考C语言比较查询的例子,你要写个查询整形链表第几个值和一个整形对比,写出来了,第二天要写字符型的,第三天要写别的类型的,烦的烦死了,其实查询就是甲,比较就是乙,只要甲别告诉乙比的是什么,给个指针,电话号码,乙拿这个指针,和要比对象的指针然后取值比较就可以了

2是比同步省资源,乙不用24小时守在甲旁,有事回电话就成,参考java的监听器,ajax,否则我是不知道怎么写,循环判断?还是每隔几秒判断?

3分层的,估计就是百科哪个EnumWindow,比如乙拿到电话,他可能是用手机打,用座机打,还是用什么打,甚至可以再回调判断什么时候打回去啊,不过这都和底层无关了,分层的好处相比不用多说了把

7. 回调函数

回调函数是指在“适当的时候”,由 [操作系统] 调用  的函数,不能在程序中调用

这个“适当的时候”,例如:
你单击按钮,发生了WM_COMMAND消息,操作系统自动调用 消息处理函数
单击关闭按钮,发生了WM_CLOSE消息,操作系统自动调用 消息处理函数

还有,枚举子窗口时:
程序员编写一个回调函数myproc()

用EnumChildWindows这个API函数指定回调函数为我们编写的myproc,
那么,操作系统就会调用myproc来处理枚举事件。

程序员需要做的是:编写回调函数myproc,用API指定回调函数为myproc,

而不是直接调用myproc,因为我们没办法判断什么时候才是“适当的时候”

回调函数

8. 什么是回调函数,该如何处理

A(主调) 调用 B(被调) 
让B完成一些事情。
但是这个事情有可能耗时很久, 也有可能需要多次通知A。 这样就无法通过参数或者返回值方式来通知A。
于是A给B一个专用线路C (回调函数指针)
当B需要通知A的时候,就调用C,这样C就知道了。 
这就是回调函数。
如果这时冒出来一个D,也调用B, 传的回调是E。
这样C就可以根据完成了谁的事情, 调用C或者E, 来回传给各自主调。