回调函数和函数指针

转载 2016年08月29日 15:55:40

转载文章的地址:http://blog.csdn.net/qq258711519/article/details/16963503


MTK新平台的代码开始大量使用回调函数和函数指针了,一直觉得回调函数和函数指针挺神秘的,所以查了一些资料,来与大家一起来分享。

什么是回调函数

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

为什么要使用回调函数

   因为使用回调函数可以把调用者和被调用者分开,调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。

如何使用回调函数

 使用回调函数,我们需要做三件事:

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

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

回调函数是一个程序员不能显示调用的函数,通过将回调函数的地址传给调用者从而实现调用。回调函数是十分必要的,在我们想通过一个统一接口实现不同的内容,这时回调函数非常合适。

函数指针的声明

对回调函数有了一个初步的了解,下面我们来说一下函数指针。因为要实现回调,必须首先定义函数指针。

void (*) ()

左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和右边圆括弧中的入口参数

为函数指针声明类型定义:

Typedef void(* pfv)()

pfv 是一个函数指针,它指向的函数没有输入参数,返回类型为voie。使用这个类型定义名称可以隐藏负责的函数指针语法。

void (*p)();

void func()

{

……

}

p = func;

p的赋值可以不同,但一定要是函数的指针,并且参数和返回类型相同。

例如:

现学现卖的一个小例子

#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;
}


调用约定

visual c++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示调用规范(默认为_cdecl)。调用规范影响编译器产生的给定函数名,参数传递的顺序,堆栈清理责任以及参数传递机制。

不过,在win32的程序中,我见得比较多的是CALLBACK,这个宏定义在windef.h中,

#define CALLBACK    __stdcall

它约定了函数在它们返回到调用者之前,都会从堆栈中移除掉参数。

 

摘自:

回调函数

http://hi.baidu.com/spidermanzy/blog/item/b25b00956469c6097bf48016.html

回调函数以及钩子函数的概念

http://zq2007.blog.hexun.com/9068988_d.html

声明函数指针并实现回调

http://www.vckbase.com/document/viewdoc/?id=195

函数指针与回调函数详解

函数指针与回调函数详解1.什么是函数指针?函数指针就是指针。这个指针存放一个函数的地址,而函数的名称就该函数的入口,即地址。这类似于数组名就是数组的首地址。我们可以通过反汇编直观的查看到函数名和函数地...
  • men_wen
  • men_wen
  • 2016年09月29日 14:08
  • 2222

深入浅出剖析C语言函数指针与回调函数(二)

上一篇博文的地址:http://blog.csdn.net/morixinguan/article/details/65494239这节,我们来看看函数指针与回调函数在Linux内核中的应用。从上节我...
  • morixinguan
  • morixinguan
  • 2017年03月25日 17:21
  • 1853

【C++基础之八】函数指针和回调函数

C++很多类库都喜欢用回调函数,MFC中的定时器,消息机制,hook机制等待,包括现在在研究的cocos2d-x中也有很多的回调函数。 1.回调函数 什么是回调函数呢?回调函数其实就是一个通过函数指针...
  • jackyvincefu
  • jackyvincefu
  • 2013年09月16日 09:40
  • 28177

深入浅出剖析C语言函数指针与回调函数(一)

今天我们要搞明白的一个概念叫回调函数。什么是回调函数?百度的权威解释如下:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数...
  • morixinguan
  • morixinguan
  • 2017年03月24日 00:19
  • 6468

声明函数指针实现回调

 程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论)。声明函数指...
  • sendy888
  • sendy888
  • 2007年07月31日 16:24
  • 1835

函数指针与回调函数的用法

前段时间介绍了函数指针与状态机的用法,这篇文章介绍下函数指针与回调函数之前的用法。 回调函数回调函数即callback function,一般是先注册,后调用的方式调用。之前在工作中,有一款ALPS的...
  • liebecl
  • liebecl
  • 2017年08月16日 17:56
  • 89

C/C++回调方式系列之一 函数指针和函数回调模式

一、函数指针 1. 函数的定义 return_type function_name(parameter list) { function_body }...
  • SweetTool
  • SweetTool
  • 2017年05月20日 15:45
  • 1484

C/C++之回调函数---函数指针的作用

今天讨论下C/C++中的回调函数。      在理解“回调函数”之前,首先讨论下函数指针的概念。 函数指针 (1)概念:指针是一个变量,是用来指向内存地址的。一个程序运行时,所有和运行相关的物件都是需...
  • kkk0526
  • kkk0526
  • 2013年12月04日 17:24
  • 5469

java 回调函数实现方式

回调函数定义:传递一个函数A到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称,就叫做匿名回调函数.或者将一个方法对象a 传递给另一个方法对象 b,让后者在适当的时候...
  • hahalzb
  • hahalzb
  • 2011年04月02日 11:25
  • 5879

钩子函数与回调函数的区别

回调函数 钩子函数 有什么区别  分享| 2014-11-17 13:59小妖有爱270 | 浏览 907 次  编程语言 举报| 2014-11-18 10:37 ...
  • g200407331
  • g200407331
  • 2016年04月20日 17:38
  • 697
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:回调函数和函数指针
举报原因:
原因补充:

(最多只允许输入30个字)