人类的孤独像是一种与生俱来的残疾。

回调函数

C语言 smallfish 1371℃

写了几年的程序,但从来没用过回调函数,一直以为比较难,因为看的资料是这样的:

如果参数是一个函数指针,调用者可以传递一个函数的地址给实现者,让实现者去调用它,这称为回调函数(Callback

Function)。

不知道是不是本人理解力有问题,总感觉这个定义太绕。所以,一直也没理明白。

上面这句话可以这样来理解:如果有这样一个函数A,它的参数是一个函数指针,调用(此函数A)的人可以传递一个函数B(另一个)的地址给这个函数A,让调用A函数的人来实现函数B,这样的A函数称为回调函数。

可能这样说还是不能让人明白,不如先上代码好了。

#include <stdio.h>

typedef void (*callback_t)(void *);

void id(void *id)
{
    printf("Your ID is %d!\n", *(int *)id);
}

void bye(void *str)
{
    printf("Bye, %s!\n", (char *)str);
}

void print(callback_t f, void *para)
{
    f(para);
}

int main(int argc, char *argv[])
{
    int *id_num, i = 123;
    argc = argc;
    argv = argv;

    id_num = &i;

    print(id, id_num);
    print(bye, "Small fish");

    return 0;
}

首先定义一个函数指针类型,方便后续定义。再定义两个函数,这两个函数的参数、返回值都是一样的,都是void、void *型。对于void print(callback_t f, void *para)函数来说,它是不知道传入的f()要做什么,也不知道它要什么样的参数,它只起到一个调用的作用,而具体执行的东西由实际传入的f()决定。例如print(id, id_num);,它传入的是:

 void id(void *id)
 {
     printf("Your ID is %d!\n", *(int *)id);
 }

。对于编写id函数的人来说,它当然知道id()函数要做什么,它就是为了输出“Your ID is xxx”。同时,id()函数的参数也应该是整型的id值。因此,它需要把void *类型转为int *。而bye()函数同理。

在这里,print()函数就是一个回调函数,它仅提供了一种函数的调用形式。因此,从这个观点看,回调函数其实是在更高层次对一般函数进行封装。

转载请注明:OpenMind » 回调函数

喜欢 (0)