0%

c语言教程之回调函数实现

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*
* @file c语言实现回调函数
* @detial 在java等更高级的语言中往往已经给我们封装好了回调函数的调用方式,直接用就可以了。
* 而C语言中并没有这种直接可以操作的回调方式,我们用函数指针来实现回调原理。
*/
#include<stdio.h>

// 将函数名作为指针的格式为:int (*ptr)(char *p) 即:返回值(指针名)(参数列表)
typedef int (*callbackfun)(char *str); // 回调函数的名称为 callback,参数是char *p

// functionA的格式符合 callback 的格式,因此可以看作是一个 callback类型
int functionA(char *str)
{
printf("回调 functionA(char *str) 函数:%s!\n", str);
return 0;
}

// functionB的格式符合 callback 的格式,因此也可以看作是一个 callback类型
int functionB(char *str)
{
printf("回调 functionB(char *str) 函数:%s!\n", str);
return 0;
}



// 调用回调函数,方式一:通过命名方式
int test1(callbackfun p_callback, char *str)
{
printf("test1:\n不调用回调函数打印:%s!\n", str);
p_callback(str);
return 0;
}

// 调用回调函数,方式二:直接通过函数指针
int test2(int (*ptr)(), char *str)
{
printf("test2:\n不调用回调函数打印:%s!\n", str);
(*ptr)(str);
}

int main()
{
char *str = "hello world!";

test1(functionA, str);
test1(functionB, str);
test2(functionA, str);
test2(functionB, str);

printf("test3:\n");
callbackfun test3 = functionB;
test3(str);

return 0;
}

运行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
IOTTS@IOTTS:/mnt/e/GCC_TEST$ ./callback
test1:
不调用回调函数打印:hello world!!
回调 functionA(char *str) 函数:hello world!!
test1:
不调用回调函数打印:hello world!!
回调 functionB(char *str) 函数:hello world!!
test2:
不调用回调函数打印:hello world!!
回调 functionA(char *str) 函数:hello world!!
test2:
不调用回调函数打印:hello world!!
回调 functionB(char *str) 函数:hello world!!
test3:
回调 functionB(char *str) 函数:hello world!!

另一个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
typedef void (*callback)(char *);
void repeat(callback function, char *para)
{
function(para);
}
void hello(char* a)
{
printf("Hello %s\n",(const char *)a);
}
void count(char *num)
{
int i;
for(i=1;i<(int)num;i++)
printf("%d",i);
putchar('\n');
}
int main(void)
{
repeat(hello,"jack lu");
repeat(count, (char *)4);
}

运行结果如下:

1
2
3
iotts@jacklu:~$ ./a.out 
Hello jack lu
123