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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是回调函数,如何写一个回调函数相关的知识,希望对你有一定的参考价值。

谁能给我详细的讲讲什么是回调函数,如何写一个回调函数呢?
麻烦大家能给我一个详细的例子来说明一下!

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

什么是回调函数?

 我在一个github的代码上看到有命名为Callback的函数。

 我今天之前对回调函数的概念都不清除,回调函数是什么?如何使用以及有什么优势?带着这三个问题。利用费曼学习法的精神,我把我理解的概念整理复盘,加深印象。

什么是编程类型

首先,在知道回调函数的概念前,需要清楚另外一个编程类型的概念。

编程分为两种类型:系统编程以及应用编程。

系统编程的对象是API,编程人员使用库进行开发,库是开发的底层结构,是开发人员利用的工具和服务。系统编程基于库的编程。

而应用编程是程序员开发应用需要编写的程序,编写的程序调用库中的函数暴露出的接口,实现编程人员的功能需求。

明显看出上述可以分成两个不同的抽象层次,底层我称之为库层,上一层称为应用层。

 

什么是回调函数?

回调函数在应用层,作为API的参数被库层调用。

这里可以举一个例子说明一下这之间的管理。

酒店一般会为客户提供叫醒服务。但是客户可以选择如何被叫醒。可以是服务员到时敲门,可以是电话叫醒,可以是用一桶水泼醒,这几种方式最为客户的意愿

告诉酒店。

很明显,酒店的叫醒服务是库层的API服务,这里换个说法,叫做中间函数。而客户的意愿是回调函数。

 

A-B还是A-b-c?

网上很多说法是中间函数调用了回调函数,是A-b关系。但是实际上回调函数是A-b-c的关系。

我们不要忽略了调用中间函数的对象,我把它称为初始函数。

回调函数和初始函数处于同一抽象层------应用层。

回调函数的流程是:

(1)初始函数调用了中间函数,并决定调用中间函数的参数--回调函数对象。

(2)中间函数执行过程中调用了回调函数。

 

初始函数也有它的作用。

(1)阻塞型回调函数:在初始函数返回前调用回调函数

(2)延迟型型函数:在初始函数返回后调用回调函数

延迟型回调函数一般是多线程的。

 

回调函数的优势?

回调函数可以改变中间函数的内容以及结果,非常灵活。

以上是关于什么是回调函数,如何写一个回调函数的主要内容,如果未能解决你的问题,请参考以下文章

同步回调函数和异步回调函数

C++中的回调函数

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

如何写JavaScript中的callback回调函数

在JAVA里 啥是回调函数啊.?

异步回调函数