php网站开发多线程开发,江苏网站seo营销模板,南京做公司网站的公司,做购物网站流程对回调#xff08;callback#xff09;函数的一点粗陋理解#xff0c;在我小时候#xff0c;隔壁村有家月饼小作坊#xff08;只在中秋那段时间手工制作一些月饼出售#xff0c;后来好像不做了#xff09;#xff0c;做出的月饼是那种很传统很经典的款式#xff0c;里… 对回调callback函数的一点粗陋理解在我小时候隔壁村有家月饼小作坊只在中秋那段时间手工制作一些月饼出售后来好像不做了做出的月饼是那种很传统很经典的款式里面有红绿丝、冰糖以及芝麻好像也只做这一种曾经跟着大人进去过一次里面有张木头制作的月饼模子原来花瓣状的月饼是用它压出来的啊我们的回调函数指针就是这张月饼模子。功能是制作月饼函数返回值配料参数是面粉和油以及馅料。假如这个作坊一共有3个工人每个工人负责一种馅料五仁、豆沙、蛋黄月饼他们都需要这张月饼模子来制作自己的月饼换句话说他们都要提供同样类型的参数配料并得到同样类型的结果月饼至于具体的里子和做法函数实现必须得他们个人定在实际生产程序流程中这仨工人按各自节奏准备好自己的物料函数实现当在需要制作月饼时调用回调函数将配料往模子里这么一压哟嘿糯和和的月饼制作出来了。 这一天当中不同的师傅拿这个模子回调函数指针按自己的方法函数具体实现塞入配料参数压出了不同口味的月饼不知道有没有越描越糊涂的嫌疑。 下面再简单说说两个比较常见的用法。
例子一
一般使用理解概念
#includestdio.hint Callback_1(char *m) // Callback Function 1
{printf(Hello, this is Callback_1 %s\n, m);return 0;
}int Callback_2(char *n) // Callback Function 2
{printf(Hello, this is Callback_2 %s\n, n);return 0;
}int Callback_3(char *t) // Callback Function 3
{printf(Hello, this is Callback_3 %s\n, t);return 0;
}int Handle(int (*Callback)(char *), char *val)
{printf(Entering Handle Function. \n);Callback(val);printf(Leaving Handle Function. \n);
}int main()
{printf(Entering Main Function. \n);Handle(Callback_1, wuren);Handle(Callback_2, dousha);Handle(Callback_3, danhuang);printf(Leaving Main Function. \n);return 0;
} 上面的代码中月饼模子就是int (*Callback)(char *)返回值是int月饼参数是char *配料,三个师傅各自的秘密配方及手法分别是int Callback_1(char *m)、int Callback_2(char *n)、int Callback_3(char *t)这个int Handle(int (*Callback)(char *), char *)函数就是标准的工艺流程。在制作时主函数内部调用我们让师傅们轮流来操作一号师傅拿起wuren配料制作出了五仁月饼二号师傅拿起“dousha”配料制作出了豆沙月饼三号师傅拿起danhuang配料制作出了蛋黄月饼。返回情况如下。 例子二
结构体使用使用拓展
#include stdio.htypedef struct
{int w;int h;int (*callback)(void*, void*);
}St_Rect;int area(int w, int h)
{if(w h){return w*h;}else{printf(area:invalid para!\n);return -1;}}int perimeter(int w, int h)
{if(w h){return 2*(w h);}else{printf(perimeter:invalid para!\n);return -1;}
}int empty(int w, int h)
{printf(w%d,h%d\n, w, h);return 0;
}void main(void)
{St_Rect rect;int choose -1;printf(please input w\n);scanf(%d, rect.w);printf(please input h\n);scanf(%d, rect.h);printf(please input choose result\n);scanf(%d, choose);switch(choose){case 0:rect.callback area;break;case 1:rect.callback perimeter;break;default:rect.callback empty;break;}int result rect.callback((int *)rect.w, (int *)rect.h);printf(the result is %d\n, result);
} 这段代码则是回调函数的另外一种用法很多实际项目上应该都比较常见。比如一家研发金融产品的公司他们的客户有人行、建行、农行等等国内外银行以及其他机构其中这家公司的一款清分机市场销量挺nice吸引了更多的客户来购买但是不同的客户有不同的需求清分数据的处理逻辑之前只有几家客户的情况下还可以通过类似if else、switch case这样的方法来实现不同客户的需求随着客户数量的增加再这么干不是不可以但你能忍受代码里有这么多的条件语句吗而且代码整体看起来码商也不高。此时我们就可以考虑用回调第一种使用方法的升级用法共用同一套架构初始化时给予不同的函数实现。上面的代码例子也是基于此种场景我们来看看。 我们定义了一个矩形结构体成员变量有宽度w、高h以及一个我们的回调函数指针int (*callback)(void*, void*)这个函数指针等同于保存一个函数地址的变量而且这个回调函数有两个无类型的参数void*无类型方便我们后面拓展使用。主函数内我们让使用者分别输入宽度和高度值并在最后让使用者选择是生成矩形面积结果呢还是矩形周长结果。其中的switch语句相当于初始化过程确定最终的客户方案最后开始了我们的回调过程并返回我们选择的方案结果。 大家在日常工作学习中如有类似需求可以参考一二如果还有其他用法欢迎告知讨论