先上菜鸟营的解释:
回调函数:类似这么一个场景————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;
}