Lun*_*nja 5 c function callback
我正在学习 C 中的回调函数,发现自己很难理解回调的概念。
据我所知,c中的回调函数是使用函数指针实现的,这意味着我们可以通过使用指针来引用函数,就像我们使用指针来引用变量一样。
我这里有两个函数的实现:
1.第一种是使用回调函数
#include <stdio.h>
int add_two_number(int a, int b);
int call_func(int (*ptr_func)(int, int), int a, int b);
int main (int *argc, char *argv[])
{
printf("%d", call_func(add_two_number, 5, 9));
return 0;
}
int add_two_number(int a, int b)
{
return a + b;
}
int call_func(int (*ptr_func)(int, int), int a, int b)
{
return ptr_func(a, b);
}
Run Code Online (Sandbox Code Playgroud)
2.第二种是使用普通函数调用:
#include <stdio.h>
int add_two_number(int a, int b);
int call_two_number(int a, int b);
int main (int *argc, char *argv[])
{
printf("%d", call_two_number(5, 9));
return 0;
}
int add_two_number(int a, int b)
{
return a + b;
}
int call_two_number(int a, int b)
{
return add_two_number(a, b);
}
Run Code Online (Sandbox Code Playgroud)
这两个函数在两个数字之间进行简单的数学加法,并且这两个函数也按照我的预期正常工作。
我的问题是这两者有什么区别?当我们使用回调而不是普通函数时?
当您不知道要在调用位置调用什么函数时,就会使用回调。例如,如果您还想减去两个数字怎么办:
#include <stdio.h>
int add_two_number(int a, int b);
int sub_two_number(int a, int b);
int call_func(int (*ptr_func)(int, int), int a, int b);
int main (int *argc, char *argv[])
{
// Here is where we decide what the function should do for the first call
printf("%d", call_func(add_two_number, 5, 9));
// Here is where we decide what the function should do for the second call
printf("%d", call_func(sub_two_number, 5, 9));
return 0;
}
int add_two_number(int a, int b)
{
return a + b;
}
int sub_two_number(int a, int b)
{
return a - b;
}
int call_func(int (*ptr_func)(int, int), int a, int b)
{
return ptr_func(a, b); // Here is the place the call is made
}
Run Code Online (Sandbox Code Playgroud)
回调对于解耦代码也很有用。考虑一个具有多个按钮的应用程序。如果没有回调,您就必须在按钮代码中使用一些逻辑来确定单击每个按钮时会发生什么。通过使用回调,按钮代码可以保持通用,但每个按钮在单击时仍然可以调用不同的操作。