本文主要介绍如何使用回调函数,一步一步地教会你搭建自己的回调函数,并且在本篇文章会加入一些我对回调函数的一些思考。
先来看看一个函数的声明、定义和调用
//函数原型的声明
void print(char *p);
//函数定义
void print (char *p) {
printf("%s",p);
}
//函数调用
print("this is pointer to function\n");
看起来很容易理解,函数的使用已经成为日常,继续下一个话题,声明并定义函数指针
//声明一个函数指针,格式: 类型 (*p) (形参1,形参2,....)
void (*p) (char *);
//定义一个函数指针,p = & 函数名 。
p= &print;
//声明并定义格式:函数返回类型 (*p) (形参1,形参2,....) = & 函数名
void (*p)(char *) = &print;
这里需要注意的是,定义函数指针时参数数量与所指函数要一致。
下面是一个综合例子,依旧采用模块化思想
/*------------------------------------------
Main.c
------------------------------------------*/
#include <stdio.h>
#include "PointerToFunction.h"
int main () {
void (*p)(char *) ;
p= &print;
//指针调用方式有两种
p("this is pointer to function");
(*p)("this is pointer to function");
printf("-----------------------------------\n");
//拓展
start(p);
start(print);
return 0;
}
/*------------------------------------------
PointerToFunction.c
------------------------------------------*/
#include <stdio.h>
#include "PointerToFunction.h"
void print (char *p) {
printf("%s\n",p);
}
void start(void (*p)(char *) ){
p("Start");
}
/*------------------------------------------
PointerToFunction.h
------------------------------------------*/
#ifndef _PointerToFunction_
#define _PointerToFunction_
void print(char *);
void start( void (*p)(char *) );
#endif
运行结果
gcc -o exe/PointerToFunction Main.c PointerToFunction.c PointerToFunction.h
exe/PointerToFunction
this is pointer to function
this is pointer to function
-----------------------------------
Start
Start
Makefile 文件
run : Main.c PointerToFunction.c PointerToFunction.h
gcc -o exe/PointerToFunction Main.c PointerToFunction.c PointerToFunction.h
exe/PointerToFunction
当你理解完上面的那个案例后,那么你离理解回调函数不远了。
这里简单说一下回调函数的使用方法
-
声明并定义一个函数1(回调函数)
-
声明并定义一个函数2,并且其中一个参数是指向回调函数的指针
-
重点来了,函数指针的使用,一般有两种思路
- 在函数2中利用函数指针调用回调函数
- 在函数2中用全局变量记录回调函数的地址,在其他地方调用回调函数
第一种思路在上面已经演示过,下面来看第二种思路的案例
/*------------------------------------------
Main.c
------------------------------------------*/
#include <stdio.h>
#include "PointerToFunction.h"
//声明一个回调函数print
void print(char *);
int main () {
//记录回调函数
SetCallback(print);
while (1) {
//调用回调函数
listening();
}
return 0;
}
void print (char *p) {
//处理数据
printf("%s\n",p);
}
/*------------------------------------------
PointerToFunction.c
------------------------------------------*/
#include <stdio.h>
#include "PointerToFunction.h"
static void (*pointer)(char *);
void SetCallback(void (*p)(char *) ){
pointer = p;
}
void listening () {
//延迟
for(int i=0;i<30000*1000;i++)
;
pointer("执行回调函数");
}
/*------------------------------------------
PointerToFunction.h
------------------------------------------*/
#ifndef _PointerToFunction_
#define _PointerToFunction_
void SetCallback( void (*p)(char *) );
void listening();
#endif
运行结果
gcc -o exe/PointerToFunction Main.c PointerToFunction.c PointerToFunction.h
exe/PointerToFunction
执行回调函数
执行回调函数
执行回调函数
执行回调函数
执行回调函数
执行回调函数
执行回调函数
执行回调函数
.......