回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
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
|
#include<stdio.h>
typedef int (*callbackfun)(char *str);
int functionA(char *str) { printf("回调 functionA(char *str) 函数:%s!\n", str); return 0; }
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
|