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=1; i<=(int)count; i++)
printf("%d ", i);
putchar('\n');
}
int main(void)
{
//调用者
repeat_three_times(say_hello, "Guys");
repeat_three_times(count_numbers, (void *)4);return 0;
}
案例来自linuxC 一站式编程
从上面可以看到,调用者是main,所以调用者必须要声明回调函数,以及去实现回调函数。当调用者在调用repeat_three_times的时候,这个时候,将函数指针与回调函数都传递进去,做void*指针类型的转换,这个时候就可以是实现函数回调了。