给实验室编写hdntCenter的charts库的时候,遇到了一些问题,其中一点是串口读数丢失数据,可能跟QT的信号-槽机制的速度太慢有关,师兄建议避开信号-槽机制,改用回调函数的方式来写。
关于回调函数,有一下几点问题
- 什么是回调函数
- 如何创建回调函数
- 如何使用回调函数
- 回调函数和信号-槽机制的比较与取舍
- 其他的注意事项
1. 什么是回调函数
https://blog.youkuaiyun.com/callmeback/article/details/4242260 中,对
- 回调函数是什么东西?
- 回调函数怎么开发,怎么使用?
- 回调函数的作用,应该在什么情况下使用?
这三个问题做了解答。
抛开回调的机制不说,回调函数本身,可以理解为将函数作为一个自变量,赋予另一个函数,可以类比为复变函数。而赋值的方式,则为函数指针。即将一个指向被调用函数的地址的指针,作为实参传递给调用函数。
2.如何创建回调函数
回调函数本身与一般的函数并无区别,符合通用的创建函数的准则。
3.如何使用回调函数&函数指针
i 使用回调函数首先需要创建被回调函数本身。
int add1(int datIn)
{
return datIn + 1;
}
int minus1(int datIn)
{
return datIn - 1;
}
ii 函数指针的声明
int(*pFunc)(int);
要注意的是,函数指针和被指向的函数之间必须严格保持同样的格式,包括返回类型和参数类型及个数。
另外,要注意与指针函数区分开来
int *pFunc(int);
上面的代码声明了一个返回int指针的函数。
在声明了被调用函数之后,可以用函数名来初始化函数指针,编译器会自动将函数名转换为地址,并将其储存在该指针中。
int(*pFunc)(int) = minus1;
iii 创建调用函数
int getAns(int datIn, int (*pfunc)(int))
{
return pfunc(datIn);
}
同样,调用函数中,涉及到函数指针的形参部分,格式必须严格一一对应,否则无法调用。
完整代码如下:
#include <stdio.h>
#include<iostream>
using namespace std;
int add1(int datIn)
{
return datIn + 1;
}
int minus1(int datIn)
{
return datIn - 1;
}
int getAns(int datIn, int (*pfunc)(int))
{
return pfunc(datIn);
}
void main()
{
int datIn = 2;
int datOut1, datOut2;
int(*pFunc)(int);//声明函数指针
cout << "回调函数的结果:" << endl;
datOut1 = getAns(datIn, add1);
datOut2 = getAns(datIn, minus1);
cout << "datOut1:" << datOut1 << endl;
cout << "datOut2:" << datOut2 << endl;
cout << "----------" << endl;
cout << "直接使用函数指针的结果:" << endl;
pFunc = add1;//给函数指针幅值
cout << "datOut1:" << pFunc(2) << endl;
pFunc = minus1;
cout << "datOut2:" << pFunc(2) << endl;
getchar();
}
运行结果如下:
此外,函数指针也可以进行迭代:
cout << "----------" << endl;
cout << "函数指针的迭代:" << endl;
pFunc = add1;
cout << "pFunc(pFunc(2)):" << pFunc(pFunc(2)) << endl;
其结果如下:
4.回调函数和信号-槽机制的比较与取舍