回调函数一 同步回调及代码
什么是回调函数?
-
编程除了分为面向对象和面向过程外,还可以分为系统编程和应用编程。如下图所示,主函数和callback函数在应用层,library函数在系统层。在使用时,main将callback函数指针传入给library函数,library函数在运行时通过传入的callbakc函数指针调用callback函数。而首先函数指针做为参数传入,而后根据该参数被调用的callback函数,称作回调函数 。
回调函数基本参数和分类
-
回调函数使用一般分为以下几个部分
-
回调函数
-
登记回调函数
-
触发回调事件
-
调用回调函数
-
响应回调事件
-
-
假设此时你在上课,但是突然想上厕所,你举手向老师汇报,但是此时老师讲到重要部分,让你稍等一下,讲完重要部分后,老师示意你去上厕所,然后你去厕所。此时上厕所这件事就是回调函数,你举手汇报就是登记回调函数,当老师讲完内容后就是触发回调事件,示意你上厕所就是调用回调函数,你去厕所就是响应回调函数。
-
回调函数分为阻塞式回调和延迟式回调,又可称为同步回调和异步回调。阻塞式回调里,回调函数的调用一定发生在起始函数返回之前;而延迟式回调里,回调函数的调用有可能是在起始函数返回之后。在上面的例子就是属于同步回调,因为在老师讲课时,你只能阻塞在这里等待。而异步回调一般用于多进程或者多线程。比如此时上厕所这件事比较急,但是你又不想错过老师的精彩演讲。那么你拿出你的手机开始录音(开启一个新进程)。当你上完厕所后回来听录音,这种做法一般称为异步回调
回调函数的优点和代码
-
如文章开始的图,回调函数最大的优点就是灵活性,可以将主函数和回调函数解耦,不必直接用主函数调用回调函数,同时可以不修改中间函数的内容,调用不同的回调函数的函数指针,从而实现不同的函数效果。
-
以下代码就是通过回调函数,不修改handle函数的情况下,达到两个数加减乘除的效果
#include <stdio.h> int call_back1(int x, int y) { printf("X+Y is %d\n", x+y); return 0; } int call_back2(int x, int y) { printf("X-Y is %d\n", x-y); return 0; } int call_back3(int x, int y) { printf("X*Y is %d\n", x*y); return 0; } int call_back4(int x, int y) { printf("X/Y is %d\n", x/y); return 0; } int handle(int a, int b, int (*call_back)(int, int)) { printf("enter handle function\n"); call_back(a, b); printf("esc handle function\n"); return 0; } int main(int args,char *argv[]) { int a = 8, b = 4; handle(a, b, call_back1); handle(a, b, call_back2); handle(a, b, call_back3); handle(a, b, call_back4); return 0; }
结果: