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

作者&投稿:督柱 (若有异议请与网页底部的电邮联系)
回调函数一般都什么作用求解~

1.回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。
2.回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。为此,你需要做三件事:1,声明;2,定义;3,设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用。
3.所谓回调函数就是按照一定的形式由你定义并编写实现内容,当发生某种事件时,而由系统或其它函数来调用的函数。使用回调函数实际上就是在调用某个函数时,将自己编写的一个函数的地址作为参数传递给那个函数。而那个函数在需要的时候,也就是某种事情发生的时候,利用传递的函数地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。回调函数只能是全局函数,或者是静态函数,因为这个函数只是在这个类中使用,所以为了维护类的完整性,我们用类的静态成员函数来做回调函数。
4.对于很多初学者来说,往往觉得回调函数很神秘,很想知道回调函数的工作原理。本文将要解释什么是回调函数、它们有什么好处、为什么要使用它们等等问题,在开始之前,假设你已经熟知了函数指针。
(1)什么是回调函数?
简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。
(2)为什么要使用回调函数?
因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。
如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。
回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上,SetTimer()API使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的消息队列。
另一个使用回调机制的API函数是EnumWindow(),它枚举屏幕上所有的顶层窗口,为每个窗口调用一个程序提供的函数,并传递窗口的处理程序。如果被调用者返回一个值,就继续进行迭代,否则,退出。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。
不管怎么说,回调函数是继续自C语言的,因而,在C++中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或函数符(functor),而不是回调函数。

首先你必须明白回调函数是干什么的,有什么机制,为什么要使用,然后怎么使用。回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
回调函数实现的机制是
  (1)定义一个回调函数;   (2)提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;   (3)当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
编辑本段为什么要使用回调函数
  因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。   如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。   回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上,SetTimer() API使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的消息队列。   另一个使用回调机制的API函数是EnumWindow(),它枚举屏幕上所有的顶层窗口,为每个窗口调用一个程序提供的函数,并传递窗口的处理程序。如果被调用者返回一个值,就继续进行迭代,否则,退出。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。   不管怎么说,回调函数是继续自C语言的,因而,在C++中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或函数符(functor),而不是回调函数。
编辑本段简单的回调函数实现
代码实现
  下面创建了一个sort.dll的动态链接库,它导出了一个名为CompareFunction的类型--typedef int (__stdcall *CompareFunction)(const byte*, const byte*),它就是回调函数的类型。另外,它也导出了两个方法:Bubblesort()和Quicksort(),这两个方法原型相同,但实现了不同的排序算法。   void DLLDIR __stdcall Bubblesort(byte* array,int size,int elem_size,CompareFunction cmpFunc);   void DLLDIR __stdcall Quicksort(byte* array,int size,int elem_size,CompareFunction cmpFunc);   这两个函数接受以下参数:   ·byte * array:指向元素数组的指针(任意类型)。   ·int size:数组中元素的个数。   ·int elem_size:数组中一个元素的大小,以字节为单位。   ·CompareFunction cmpFunc:带有上述原型的指向回调函数的指针。   这两个函数的会对数组进行某种排序,但每次都需决定两个元素哪个排在前面,而函数中有一个回调函数,其地址是作为一个参数传递进来的。对编写者来说,不必介意函数在何处实现,或它怎样被实现的,所需在意的只是两个用于比较的元素的地址,并返回以下的某个值(库的编写者和使用者都必须遵守这个约定):   ·-1:如果第一个元素较小,那它在已排序好的数组中,应该排在第二个元素前面。   ·0:如果两个元素相等,那么它们的相对位置并不重要,在已排序好的数组中,谁在前面都无所谓。   ·1:如果第一个元素较大,那在已排序好的数组中,它应该排第二个元素后面。   基于以上约定,函数Bubblesort()的实现如下,Quicksort()就稍微复杂一点:   void DLLDIR __stdcall Bubblesort(byte* array,int size,int elem_size,CompareFunction cmpFunc)   {   for(int i=0; i elem2)   return 1;   return 0;   }   int __stdcall CompareStrings(const byte* velem1, const byte* velem2)   {   const char* elem1 = (char*)velem1;   const char* elem2 = (char*)velem2;   return strcmp(elem1, elem2);   }   下面另有一个程序,用于测试以上所有的代码,它传递了一个有5个元素的数组给Bubblesort()和Quicksort(),同时还传递了一个指向回调函数的指针。   int main(int argc, char* argv[])   {   int i;   int array[] = {5432, 4321, 3210, 2109, 1098};   cout << "Before sorting ints with Bubblesort
";   for(i=0; i < 5; i++)   cout << array<< ’
’;   Bubblesort((byte*)array, 5, sizeof(array[0]), &CompareInts);   cout << "After the sorting
";   for(i=0; i < 5; i++)   cout << array<< ’
’;   const char str[5][10] = {"estella","danielle","crissy","bo","angie"};   cout << "Before sorting strings with Quicksort
";   for(i=0; i < 5; i++)   cout << str<< ’
’;   Quicksort((byte*)str, 5, 10, &CompareStrings);   cout << "After the sorting
";   for(i=0; i < 5; i++)   cout << str<< ’
’;   return 0;   }   如果想进行降序排序(大元素在先),就只需修改回调函数的代码,或使用另一个回调函数,这样编程起来灵活性就比较大了。

什么是回调函数?
  回调函数是应用程序提供给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调用。

什么是回调函数?
  回调函数是应用程序提供给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调用。
/zhd≠/;! 回答采纳率:19.0% 2008-11-26 14:41
回调函数函数就是把一个函数指针传递给另外一个函数,让另外一个函数调用。
经常的,当一个接口不知道用户需要干什么,就可以提供这样一个回调接口,让用户定义函数来执行。
C语言中创建线程的函数就是最明显的回调函数。在windows系统里,这种函数一般叫做钩子,hook

回调函数函数就是把一个函数指针传递给另外一个函数,让另外一个函数调用。
经常的,当一个接口不知道用户需要干什么,就可以提供这样一个回调接口,让用户定义函数来执行。
C语言中创建线程的函数就是最明显的回调函数。在windows系统里,这种函数一般叫做钩子,hook


回调函数(callback)是什么?
当我们面对不可预测的事件,比如网络请求的响应,我们不能坐等结果。这时,我们会设定一个处理流程,即回调函数,预先定义好如何处理这个事件。这个流程就像是一个待办事项列表,当事件发生时,程序会按照这个清单进行操作,而这个操作的过程就是回调函数的调用。以购物为例,想象你在网店下单,但商品暂时缺货...

什么是回调函数
回调函数是一种设计模式,它巧妙地将调用者与被调用者之间的依赖关系解耦。在编程中,调用者并不关心具体是哪个函数被调用,只需知道存在一个具有特定接口和约束(比如返回类型为int)的函数可供调用。以音频采集为例,当数据被采集完成后,采集模块会自动调用一个回调函数,通知使用者数据已准备好。使用...

回调函数一般都什么作用求解
它只关心返回值,因为基于返回值,它将继续执行或退出。不管怎么说,回调函数是继续自C语言的,因而,在C++中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或函数符(functor),而不是回调函数。

在JAVA里 什么是回调函数啊.?
在Java编程中,回调函数是一种设计模式,它允许一个对象在完成特定任务后,调用另一个对象的指定方法。简单来说,这是通过一个对象(客户程序C)调用另一个对象(服务程序S)的函数A,然后在合适的时候,服务程序S会调用客户程序C预先定义的函数B,这个B函数就是回调函数。回调在处理异步操作时特别有用...

回调函数是什么?
回调函数,如同一个电话约定,当你完成一部分工作后,会通知另一个程序接手并继续执行。在编程中,应用程序将回调函数的地址提供给DLL,当特定条件满足时,DLL会自动调用这个函数,处理后续任务。回调函数常用于处理异步事件、截获消息或获取系统信息,它们遵循预先约定的参数规则,以防止系统崩溃。在WindowsAPI...

js回调函数是干什么的呢?
1、回调函数的概念 回调是一个函数,它作为参数传递给另一个函数,并在其父函数完成后执行。function doSomething(msg, callback){ alert(msg);if(typeof callback == "function")callback();} doSomething("回调函数", function(){ alert("匿名函数实现回调!");});2、通常使用场景:从上面的...

什么是回调函数,英文用callback,为什么叫回调函数,有什么实际的功能...
别人的函数(参数1,参数2,回调函数)并且告诉你回调函数的格式如下 回调函数(参数1:当前数量,参数2:总数量)你使用时必须按照这个格式定义一个函数,然后传给他。如下,别人的函数(参数1,参数2,你写的回调函数名字)这样,你每次调用别人的函数的时候,你写的那个回调函数就会被调用(如何调用是...

回调函数和普通函数有什么区别?
。2、对回调函数调用:调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。

好多语言里面都有回调,回调函数,回调机制,这是什么东西??
回调就是通过函数指针调用要被调用的函数。比如界面收到点击事件,就会通过映射调用函数

回调函数什么意思
简单说就是,由程序员编写的,给windows系统调用的函数。也就是说,函数的功能有你定,调用有windows系统调用,不用你关心。你所要做的只是把函数的参数按照规定格式写好,编写好函数

涧西区17035341403: 什么是回调函数,如何写一个回调函数
再夏福里: 什么是回调函数? 回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件.应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数.回调函数必须遵守事先...

涧西区17035341403: 如何正确写一个回调函数....... -
再夏福里: 符合回调函数的调用约定、参数及返回值类型即可.

涧西区17035341403: 怎么来写一个回调函数 -
再夏福里: 你问这个问题有点含糊.在Windows中不同的领域的回调函数是不同的.例如在创建窗口中使用的窗口函数是在窗口类中填写,然后使用API注册. 不过简单的来说.得先按照API的要求编写一个函数.例如创建窗口要求的消息处理回调函数的结构是: ...

涧西区17035341403: 什么叫回调函数? -
再夏福里: 回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件.应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数.回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃.通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定.在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出.

涧西区17035341403: 关于回调函数的详细讲解
再夏福里: 回调函数2010年03月09日 星期二 上午 10:20 对指针的应用是C语言编程的精髓所在,而回调函数就是C语言里面对函数指针的高级应用.简而言之,回调函数是一个通过函数指针调用的函数.如果你把函数指针(函数的入口地址)传递给另一...

涧西区17035341403: 什么是回调函数 -
再夏福里: 简单说就是,由程序员编写的,给windows系统调用的函数.也就是说,函数的功能有你定,调用有windows系统调用,不用你关心.你所要做的只是把函数的参数按照规定格式写好,编写好函数 搜索一下有很多相关的贴子

涧西区17035341403: 在JAVA里 什么是回调函数啊.? -
再夏福里: 所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数. SAX的我不会写,只会用DOM4J写解析xml文档的例子 如下:SAXReader sax = new ...

涧西区17035341403: js中什么是回调函数 -
再夏福里: 在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序.

涧西区17035341403: 什么是C语言的回调函数?具体怎么用呢? -
再夏福里: 回调函数,顾名思义,也就是等该函数执行完了,会回去调用我们传进去的函数.用到回调函数的地方有不少,像我见过的:SQLite中的一个函数,sqlite_exec函数名有没有记错我没什么印象了.待这个函数执行完毕后,会去调用我传进去的一个函数,一般回调函数都是有自己的参数列表格式的,再利用这个格式从回调函数中获取到我们需要的一些值.

涧西区17035341403: 什么是回调函数,英文用callback,为什么叫回调函数,有什么实际的功能?
再夏福里: 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 举个例子来说最简单了,比如在一个注册页面上,肯定要在后台去判断你输入的用户名是不是已经被注册了,这样一般是用ajax来实现,js发送用户填写的用户名到后台,后台查询数据库后再返回页面看是否已经被注册 注册的话就需要弹一个提示给用户,那么弹提示的这个方法就是回调函数,他只在后台成功返回数据的时候被调用.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网