Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63672
  • 博文数量: 96
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 852
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-13 20:47
个人简介

扎斯特都恩特

文章分类

全部博文(96)

文章存档

2018年(1)

2017年(2)

2016年(82)

2015年(11)

我的朋友

分类: C/C++

2016-04-27 23:41:45

一、什么是回调函数

打个比方:
1、一个农场主(主调函数)要做一件事,分为3步骤:生产原材料(蔬菜、水果、家禽)、将原材料加工成成品(美味佳肴)、消费这些成品(美味佳肴);
2、农场附近有各种各样的加工店铺(被调函数):FuncVegetable(炒菜的)、FuncFruit(做水果沙拉的)、FuncMeat(加工肉类熟食的)
3、各个加工店铺给农场主一个名片(即各个加工店铺的地址),农场主根据名片(地址)找到各个加工店铺,把这些原材料给加工店铺,加工店铺按照自己的功能对原材料进行加工,(再将加工好的成品返回给农场主的过程)这就是回调

PS:
1)农场主:主调函数
2)各店铺:被调函数
3)原材料:传递给被调函数的形参
4)名片:被调函数的地址
5)回调函数注册过程如下:

    农场主在农场设了个广告牌,分两列:原材料列(形参)、店铺地址列(名片--即被调函数名)
————————————————————————————————————————————
吃的  |   西红柿 |  吃的 | 鸡蛋                ||   炒菜店铺地址(FuncVegetable
-------------------------------------------------------------------------------------------------------------------
吃的  |  苹果      |  吃的 | 凤梨                ||  做水果沙拉店地址(FuncFruit
-------------------------------------------------------------------------------------------------------------------
吃的  | 牛肉       |  吃的 |  羊肉               ||  肉类加工店地址(FuncMeat
————————————————————————————————————————————

农场主根据广告牌上各个店铺的地址(被调函数的函数名),传递原材料(形参)给对应店铺---------------这就是回调函数的注册

6)回到函数的执行:
农场主(主调函数)把原材料(形参)传给各个店铺(被调函数),各个店铺(被调函数)根据自己的功能对原材料进行加工(加工好的成品可以可以返回给农场主,也可以不返回----自己享用了,~~哈哈~~)

小结:
农场主根据名片将各种原材料交个各个店铺,各个店铺根据各自功能对原材料进行加工(加工好的成品可以返回给农场主,也可以不返回)
对比:
主调函数根据地址(被调函数的函数名)将形参传递给各被调函数,各被调函数根据各自功能对形参进行处理

这句是 所谓的

二、示例
1)农场主:对应main函数
2)各店铺:依次对应FuncVegetableFuncFruit、FuncMeat
3)吃的:变量类型
4)原材料:形参


#include
#include


/*设置一个广告牌------即定义一个函数指针*/
typedef  (*cook_callbackfunc) (int a , int b);
int  cook_register(int  a,  int  b, cook_callbackfunc  cook_func)
{
    cook_func(a,b);
}


int FuncFruit(int a, int b)
{
    printf("FuncFruit:a=%d,b=%d\n",a,b);
return (a+b);
}


int FuncMeat(int  a, int b)
{
    printf("FuncMeat:a=%d,b=%d\n",a,b); 
return (a+b); 
}


int FuncVegetable(int  a, int b)
{
    printf("FuncVegetable:a=%d,b=%d\n",a,b);
return(a+b);  
}
int main()
{
   /*1、农场主准备生产原材料---main定义变量*/
   int  vegetable_a = 10 , vegetable_b = 20;
   int  fruit_a = 12, fruit_b = 18;
   int  meat_a = 19, meat_b = 21;


   int  ret_vegetable = 0,ret_friut = 0, ret_meat = 0;


   /*2、农场主将原材料和各个店铺的地址对应起来----注册回调函数*/
   ret_vegetable =cook_register(vegetable_a ,vegetable_b,FuncVegetable);/*农场主将原材料(即形参)与店铺地址(即被调函数的函数名)一一对应起来*/
   ret_friut = cook_register(fruit_a ,fruit_b,FuncFruit);
   ret_meat = cook_register(meat_a ,meat_b ,FuncMeat);


   /*3、农场主享用成品---main函数处理被调函数返回的结果*/
   printf("main:(ret_vegetable +ret_friut +ret_meat )=%d\n",(ret_vegetable +ret_friut +ret_meat ));
   
   return 0;
}


执行结果:
$ ./a.out 
FuncVegetable:a=10,b=20
FuncFruit:a=12,b=18
FuncMeat:a=19,b=21
main:(ret_vegetable +ret_friut +ret_meat )=100
阅读(943) | 评论(0) | 转发(0) |
0

上一篇:大内高手--调试手段及原理

下一篇:SVN

给主人留下些什么吧!~~