回调中函数指针的基本原理

时间:2014-01-09 05:02:51

标签: c pointers callback function-pointers

要了解函数指针,我正在关注this教程 这个例子在那里给出了演示函数指针的目的:

#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;

}

根据作者的说法,函数'divide()'可以被认为是一个库函数。

以上的输出:

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]

使用printf语句解决了相同的目的。那为什么要使用函数指针?

4 个答案:

答案 0 :(得分:1)

回调函数指针的另一个重要用途是在所需的处理/信息不可用时立即接收异步通知。这在OS API调用中很常见 - 您进行调用,传递函数指针,稍后,当操作完成时,某些OS线程会调用您的函数。

答案 1 :(得分:0)

在此示例中,调用函数指针与在本地执行func代码相同。

但关键是你可以创建不同的表现。可以写入文件,另一个可以调用syslog,另一个可以保存在数据库中的消息。然后他们都可以传递给divide而且不会在乎。它将消息的写入与计算分开。

答案 2 :(得分:0)

函数指针只是从函数调用函数的另一种方法。当我们无法确定 complle time 时要调用的确切函数时,主要使用此方法。如果在运行时,基于任何先前的编译或返回值,必须更改要调用的函数以获取特定行为,使用函数指针很方便。

显然,对于简单的情况,它可能看起来有用[相比之下使用switch个案例],但对于更复杂的场景,使用这种方法可以使代码更加健壮,可读的。

答案 3 :(得分:0)

您提供的参考资料似乎有点误导。它将function pointers解释为callbacks 而不实际用于回调Thisfunction pointers的更好教程。 qsort()库函数是callback的一个很好的例子。