【问题标题】:Basic philosophy of function pointer in callback回调函数指针的基本原理
【发布时间】:2014-01-09 05:02:51
【问题描述】:

要了解函数指针,我正在关注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 语句可以解决相同的目的。那么为什么要使用函数指针呢?

【问题讨论】:

  • 不要以root 运行普通程序。不好的做法。

标签: c pointers callback function-pointers


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在本例中,调用函数指针与在本地执行func的代码是一样的。

    但重点是您可以创建行为不同的不同函数。一个可以写入文件,另一个可以调用 syslog,另一个可以将消息保存在数据库中。然后它们都可以传递给divide,它不会在意。它将消息的写入与计算分开。

    【讨论】:

      【解决方案3】:

      函数指针只是从函数调用函数的另一种方法。这种方法主要用于当我们无法确定要在完成时间调用的确切函数时。如果在运行时,基于任何先前的计算或返回值,必须更改要调用的函数以获得特定的行为,使用函数指针会很方便。

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

      【讨论】:

        【解决方案4】:

        您提供的参考资料似乎有点误导。它将function pointers 解释为callbacks 实际上并没有达到回调的目的
        This 将是 function pointers 的更好教程。 qsort() 库函数是 callback 的一个很好的例子。

        【讨论】:

          猜你喜欢
          • 2018-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多