C语言回调函数

先上菜鸟营的解释:
回调函数:类似这么一个场景————A君去B君店里买东西,恰好缺货,A君留下号码给B君,有货时通知A君。
If you call me, I will call you back;
Don't call me, I will call you.
如果是这样的应用场景,为什么不能重写成个普通函数,

int purchase(int A,int B)//**错误示例,无缝耦合.**
{
  if(A!=0)
    {
       if(B=0)    
        {
              printf("A没花钱");
              return notice(A);
        }
       else 
        printf("A花钱了");
    }
}
int notice(int A)
{
    printf("缺货,留下电话,call you");
    if(B!=0)
        return purchase(A,B);
}

回调函数,就是一个通过函数指针调用调用的函数。如果你把函数的指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
理解,1:被回调的函数;2:回头执行调用动作的函数。回头调用????
*的解释:In computer programming, a callback is any executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at a given time. This execution may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback.如果代码被立即执行,叫做同步回调,晚点再执行,叫异步回调。
A "callback" is any function that is called by another function which takes the first function as a parameter.函数 F1 调用函数 F2 的时候,函数 F1 通过参数给 函数 F2 传递了另外一个函数 F3 的指针,在函数 F2 执行的过程中,函数F2 调用了函数 F3,这个动作就叫做回调(Callback),而先被当做指针传入、后面又被回调的函数 F3 就是回调函数。
我明白了什么意思。但还是不知道为什么要使用?怎么使用?
解耦:

#include<softwareLib.h> // 包含Library Function所在读得Software library库的头文件//F2

int Callback() // Callback Function//F3
{
    // TODO
    return 0;
}
int main() // Main program
{
    // TODO
    Library(Callback);//F1
    // TODO
    return 0;
}

在回调中:主函数main调用了Library,而Callback作为参数被Library调用. callback就在Library中执行了一遍.如果此时想一想,库函数对我不可见,我不好更改库函数的功能,那就只能通过回调函数了.下面是个回调函数的例子:

#include<stdio.h>

int Callback_1() // Callback Function 1
{
    printf("Hello, this is Callback_1 \n");
    return 0;
}

int Callback_2() // Callback Function 2
{
    printf("Hello, this is Callback_2 \n");
    return 0;
}

int Callback_3() // Callback Function 3
{
    printf("Hello, this is Callback_3 \n");
    return 0;
}

int Handle(int (*Callback)())
{
    printf("Entering Handle Function. \n");
    Callback();
    printf("Leaving Handle Function.\n");
}

int main()
{
    printf("Entering Main Function. \n");
    Handle(Callback_1);
    Handle(Callback_2);
    Handle(Callback_3);
    printf("Leaving Main Function. \n");
    return 0;
}

Handle()函数里面的参数是一个指针,在main()函数里调用handle()函数时,给它传入了函数Callback_1,_2,_3的函数名,函数名就是对应函数的指针,现在我发现这个是真的方便.
但是带参数的回调函数在调用时.即:F1调用F2时,如果F3有参数,应该在F1调用F2时加入一个变量用以保存F2调用F3时 return回来的值.

#include<stdio.h>

int Callback_1(int x) // Callback Function 1
{
    printf("Hello, this is Callback_1 \n");
    return 0;
}

int Callback_2(int x) // Callback Function 2
{
    printf("Hello, this is Callback_2 \n");
    return 0;
}

int Callback_3(int x) // Callback Function 3
{
    printf("Hello, this is Callback_3 \n");
    return 0;
}

int Handle(int y,int (*Callback)(int))
{
    printf("Entering Handle Function. \n");
    Callback(y);
    printf("Leaving Handle Function.\n");
}

int main()
{
    int a  = 0;
    int b = 1;
    int c = 2;
    printf("Entering Main Function. \n");
    Handle(a,Callback_1);
    Handle(b,Callback_2);
    Handle(c,Callback_3);
    printf("Leaving Main Function. \n");
    return 0;
}
上一篇:【图像加密】基于matlab GUI Arnold置乱图像加密解密【含Matlab源码 1239期】


下一篇:vue+elementUI输入框调用接口校验