看STM32F767的HAL文档的时候发现程序回调函数对于理解整个程序还是有很大的帮助,就想写下了,顺便就加深对回调函数的理解。
回调函数介绍:
回调函数:实质就是传址调用,系统可以像QT中的信号和槽一样设置如何触发或是直接用一个函数指针去调用。可以用户调用也可以系统调用。
代码段
自己在编辑器打出的一个例子:
#include <iostream>
using namespace std;
char (*pFun)(int);
//定义一个函数指针,名字是pFun,返回值类型char,有一个形参
//函数的名字是一个无名函数(类似无名对象)
//该指针指向函数的起始地址
//可以理解为:char *pFun=char (int )
/*
typedef char(*TYPE)(int);
//可以理解为:typedef TYPE char (*)(int)
TYPE pFun;
//这是第二种的方式,定义的是类型而不是一个对象。
*/
//glFun是函数的起始地址,类似数组
char glFun(int a)
{
cout<<a<<endl;
//return a;
}
int main()
{
pFun=glFun;
cout<<pFun<<endl;
cout<<*pFun<<endl;
(*pFun)(2);
//*pFun代表glFun函数,传入形参2
return 0;
}
函数调用
还有一种回调函数的调用方式就是作为形参调用:
//假如这里有一个函数
//函数指针的形参只是说明这个函数还有参数,还要分配地址去分辨使用函数指针调用函数的时候传参。
int weak(int (*pfun)(int),int a)
{
(*pfun)(a);
}
//这里是函数调用
int test(int )
{......;}
int main()
{
weak(test,a);
//weak把test的地址传给定义函数的时候相当于:int *pfun=int (*)(int);pfun=test;
}
程序段中信号的传递也是同样的道理
void signal(int signum)
{
printf("时间到了,起床!\n");
}
int main()
{
signal(SIGALRM, signal);
//SIGALRM是系统宏定义好的信号
}
目录:
文章个人理解,要是有什么理解不对的地方有时间可以联系我修改。