一种使用函数指针注册函数的方法
今天看别人的代码,发现一种使用函数指针注册函数的方法,值得与大家分享一下。
什么是函数指针
函数指针也是一种指针,只不过这种指针较为特殊,指向一个函数。
例如我们现在有一个求和的函数:
//求和函数
int sum(int a,int b)
{
return a+b;
}
声明一个函数指针
// 方式1
int (*fun)(int a, int b);
// 方式2
int (*fun)(int, int);
给函数指针赋值
// 方式1
fun = sum;
// 方式2
fun = ∑
调用函数指针
int c;
// 方式1
c = fun(1,2);
// 方式2
c = (*fun)(1,2);
函数指针还可以与关键字fypedef结合使用,案例如下
#include <iostream>
using namespace std;
//用T 表示 int (*)(int, int) 类型
typedef int (*T)(int, int);
//求和函数
int sum(int a, int b)
{
return a + b;
}
int main()
{
T t = sum;
cout << t(1, 2);
return 0;
}
使用函数指针注册函数
在嵌入式编程中,我们往往用一个函数名调用函数,但函数的实现则使用了另一个函数名。
下面这个例子是一个简单的使用函数指针注册函数的方式:
#include <iostream>
using namespace std;
//两种都可
//int (*phandle)(int a, int b);
int (*phandle)(int, int);
//注册函数
void sign(void* buf)
{
phandle = (int (*)(int, int))buf;
}
//求和
int sum(int a, int b)
{
return a + b;
}
//求积
int sb(int a, int b)
{
return a * b;
}
int main()
{
//注册
sign(sum);
//调用
//注意,此处需要检查phandle是否已经注册,防止bug
if(phandle)
{
cout << phandle(2, 3) << endl;
}
//注册
sign(sb);
//调用
if(phandle)
{
cout << phandle(2, 3) << endl;
}
//比如phandle是中断服务函数
//我们可以用这种方式,来选择我们要执行的中断
return 0;
}