在刚开始学习函数调用时,不少初学者弄不清楚“普通函数调用”和“回调函数”之间的区别,下面做一个简单的对比分析。
一句话简单区分:
普通函数调用: 函数直接被调用
回调函数: 函数作为参数被调用
这样解释或许还是不够直观,我们直接看例子吧!
普通函数调用
#include <stdio.h>
// 被调用的函数1
int func1(int value)
{
printf("This is func1,value = %d\n",value);
return 0;
}
// 被调用的函数2
int func2(int value)
{
printf("This is func2,value = %d\n",value);
return 0;
}
// 普通函数调用
int handle_call_back(int value1,int value2)
{
func1(value1); // 函数直接被调用
func2(value2); // 函数直接被调用
return 0;
}
int main(void)
{
int a = 66;
int b = 88;
handle_call_back(a,b);
return 0;
}
执行结果
This is func1,value = 66
This is func2,value = 88
可以看出,这里普通函数的调用,是直接调用函数名func1和func2。
不带参的回调函数
#include <stdio.h>
// 被调用的函数1
int call_back1(void)
{
printf("This is call_back1\n");
return 0;
}
// 被调用的函数2
int call_back2(void)
{
printf("This is call_back2\n");
return 0;
}
// 回调函数
int handle_call_back(int (*call_back)(void))
{
call_back();
return 0;
}
int main(void)
{
handle_call_back(call_back1); // 函数作为参数被调用
handle_call_back(call_back2); // 函数作为参数被调用
return 0;
}
执行结果
This is call_back1
This is call_back2
可以看出,call_back系列函数是作为handle_call_back的参数被调用的。上面是不带参数的回调函数,那带参的回调函数呢?
带参数的回调函数
#include <stdio.h>
// 被调用的函数1
int call_back1(int value1)
{
printf("This is call_back1,value = %d\n",value1);
return 0;
}
// 被调用的函数2
int call_back2(int value2)
{
printf("This is call_back2,value = %d\n",value2);
return 0;
}
// 回调函数
int handle_call_back(int value,int (*call_back)(int))
{
call_back(value);
return 0;
}
int main(void)
{
int a = 10;
int b = 20;
handle_call_back(a,call_back1); // 函数作为参数被调用
handle_call_back(b,call_back2); // 函数作为参数被调用
return 0;
}
执行结果
This is call_back1,value = 10
This is call_back2,value = 20
上面的例子可以看出,handle_call_back中的参数value,可以传给int (*call_back)(int),实现了带参回调函数。