天天看点

C语言下的回调函数

C语言下的回调函数

  • 来自linuxC一站式编程中的概念
  • 回调函数以及回调函数传参的实例

提示:

博客地址:http://blog.csdn.net/qq_29924041

概念:

如果一个函数的参数是一个函数指针,调用者可以传递一个函数的地址给实现者,让实现者去调用它,这个就叫做回调函数。

如:void func(void (*f)(void *), void *p)
           
调用者 实现者

1:调用者提供一个回调函数,再提供一个准备传给回调函数的参数

2:把回调函数传给参数 f,把准备传给回调函数的参数按void *类型传给参数 p

在适当的时候根据调用者传来的函数指针 f 调用回调函数,将调用者传来的参数 p 转交给回调函数,即调用 f(p);

首先需要分清楚谁是调用者,谁是实现者;

如在上述的func的参数中有一个f的函数指针,以及一个void*p参数,那么这个函数需要被其他的函数调用。

那么这个调用者就是调用这个函数的,在调用的时候需要传递一个函数指针进去,所以在这个调用者中,需要声明或者定义一个函数指针,以及参数。将函数传递进去让func在执行的时候可以去调用。

这就是调用者与被调用者之间的关系。

案例:

/* para_callback.h */
#ifndef PARA_CALLBACK_H
#define PARA_CALLBACK_H
/*声明一个callback_t的回调函数,参数类型为void*类型的*/
typedef void (*callback_t)(void *);   
/*声明一个函数,有两个参数,一个是函数指针,一个是参数类型*/
extern void repeat_three_times(callback_t, void *);  
#endif
           
/* para_callback.c */
#include "para_callback.h"
void repeat_three_times(callback_t f, void *para)
{
f(para);
f(para);
f(para);
}
           
/* main.c */
#include <stdio.h>
#include "para_callback.h"
void say_hello(void *str)
{
    //将void*类型转换成char*类型
    printf("Hello %s\n", (const char *)str);
}
void count_numbers(void *num)
{
int i;
//将void*类型的num转换成int*类型;
int* count = (int *)num;
for(i=; i<=(int)count; i++)
    printf("%d ", i);
    putchar('\n');
}

int main(void)
{
    //调用者
    repeat_three_times(say_hello, "Guys");
    repeat_three_times(count_numbers, (void *));return ;
}
           

案例来自linuxC 一站式编程

从上面可以看到,调用者是main,所以调用者必须要声明回调函数,以及去实现回调函数。当调用者在调用repeat_three_times的时候,这个时候,将函数指针与回调函数都传递进去,做void*指针类型的转换,这个时候就可以是实现函数回调了。

继续阅读