C 回调函数指针的基本原理
为了理解函数指针,我将遵循教程 该示例用于演示函数指针的用途:C 回调函数指针的基本原理,c,pointers,callback,function-pointers,C,Pointers,Callback,Function Pointers,为了理解函数指针,我将遵循教程 该示例用于演示函数指针的用途: #include<stdio.h> #include<string.h> int func(char *s) { printf("Callback recieved : %s",s); return 0; } float divide(unsigned int a, unsigned int b, int(*status_callback)(char*)) { status_cal
#include<stdio.h>
#include<string.h>
int func(char *s)
{
printf("Callback recieved : %s",s);
return 0;
}
float divide(unsigned int a, unsigned int b, int(*status_callback)(char*))
{
status_callback("\n Recieved values...validating\n");
if(b == 0)
{
status_callback("\n b = 0 detected, aborting....\n");
return -1;
}
status_callback("\n Validation complete, performing division\n");
float ret = a/b;
status_callback("\n Division complete, returning value\n");
return ret;
}
int main(void)
{
int(*func_ptr)(char*);
unsigned int a = 6, b = 3;
printf("\n This is a prgram to find a/b\n");
func_ptr = func;
float ret = divide(a,b,func_ptr);
printf("\n divide returned [%f]\n",ret);
return 0;
}
现在我无法理解这里解释的函数指针的基本原理。我下面的代码也可以解决同样的问题(通知应用程序在库级别发生了什么):
使用printf语句可以解决同样的问题。那么为什么要使用函数指针呢 在本例中,调用函数指针与在本地执行
func
的代码相同
但问题是,您可以创建不同的函数,它们的行为不同。一个可以写入文件,另一个可以调用syslog,另一个可以将消息保存到数据库中。然后,它们都可以被传递给divide,而它不会在意。它将消息的写入与计算分离。函数指针只是从函数调用函数的另一种方法。这种方法主要用于当我们无法确定在complle时间调用的确切函数时。如果在运行时,基于任何先前的计算或重新计算的值,必须更改要调用的函数以获得特定的行为,那么使用函数指针就很方便了
显然,对于简单的情况,它可能看起来不太有用[相反,使用
开关
情况],但对于更复杂的情况,使用这种方法使代码更加健壮和可读。回调函数指针的另一个重要用途是在所需的处理/信息无法立即获得时接收异步通知。这在操作系统API调用中很常见-您进行调用,传递函数指针,稍后,当操作完成时,一些操作系统线程调用您的函数。您给出的参考似乎有点误导。它将函数指针
解释为回调
,但实际上并不用于回调对于
函数指针
,这将是一个更好的教程。qsort()
库函数是回调
不作为根运行正常程序的一个很好的例子。坏习惯。
This is a prgram to find a/b
Callback recieved :
Recieved values...validating
Callback recieved :
Validation complete, performing division
Callback recieved :
Division complete, returning value
divide returned [2.000000]
#include<stdio.h>
#include<string.h>
float divide(unsigned int a, unsigned int b)
{
printf("\n Recieved values...validating\n");
if(b == 0)
{
printf("\n b = 0 detected, aborting....\n");
return -1;
}
printf("\n Validation complete, performing division\n");
float ret = a/b;
printf("\n Division complete, returning value\n");
return ret;
}
int main(void)
{
// int(*func_ptr)(char*);
unsigned int a = 6, b = 3;
printf("\n This is a prgram to find a/b\n");
// func_ptr = func;
float ret = divide(a,b);
printf("\n divide returned [%f]\n",ret);
return 0;
root@ubuntu:/home/# ./a.out
This is a prgram to find a/b
Recieved values...validating
Validation complete, performing division
Division complete, returning value
divide returned [2.000000]