回调函数 - 灵活的函数指针

回调函数一 同步回调及代码

什么是回调函数?

  • 编程除了分为面向对象和面向过程外,还可以分为系统编程和应用编程。如下图所示,主函数和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;
    }

    结果:

发布了5 篇原创文章 · 获赞 4 · 访问量 198

猜你喜欢

转载自blog.csdn.net/MOSHIWANGJUE/article/details/105554956