最近为公司写接口用到了回调函数,虽然之前有稍微接触过,不过没有很认真的去看,这次写一点心得,以后会更多的研究,慢慢补充
需求:用户调用我的SDK接口向服务器查询设备的各种状态,如温度、湿度,每个状态都有自己的接口,数据的结构为 MSG_DATA ,但是像服务器请求以后,不知道服务器什么时候能返回消息,所以需要使用回调函数,把用户拿到数据以后的处理函数 DealData(MSG_DATA mag_data) 作为回调函数,把函数地址传给服务器
先分清几个概念:
指针函数:返回值为指针的函数,如: int * fun(); 本质上仍然是函数,只是返回值为指针
函数指针:指向函数的指针,如:int (* pfun)(int a); 直接定义一个函数指针,pfun可以指向一个返回值为int 参数为一个int的函数,如,有一个函数 int test(int a); 可以用 pfun = test,让pfun指向函数 test。
typedef int (* pfun)(int a) ; 定义了一个函数指针类型
pfun myfun; //用函数指针类型声明一个函数指针
myfun = test;
测试代码:
SDK:sdk.h
#include <iostream>
#include <Windows.h>
using namespace std;
typedef int (*CallBackFun)(int a,int b);//定义一个函数指针类型
//提供给用户的SDK接口,用来设置回调函数
void SetCallFunc(CallBackFun call_back_fun);
sdk.cpp
#include "sdk.h"
//从服务器接收消息函数
void Server_Return_Msg(CallBackFun call_back_fun)
{
Sleep(5000);//模拟服务器返回数据的时间
//假设a,b 为服务器返回的数据
int a =2;
int b =3;
call_back_fun(a,b);
}
void SetCallFunc(CallBackFun call_back_fun)
{
Server_Return_Msg(call_back_fun);
}
用户使用 SDK
#include <iostream>
#include "sdk.h"
int DealData(int a,int b)
{
cout<<a+b<<endl;
return a+b;
}
int main()
{
//当服务器有返回消息时会调用DealData
SetCallFunc(DealData);
system("pause");
return 0;
}
总结:暂时学习了一下用法,对于回调函数内存的管理等更深入的问题以后研究