使用场景
在回调某些数据(如:一个int型变量),还需要其他数据。可以在注册回调的时候把所需要的数据封装为一个结构体,转为void *类型传输。
注意:在哪个文件调用数据,就在那里定义函数指针。
代码处理(伪代码)
- 1、文件2的头文件
typedef void (*CallbackProc)(int A, void *B); //函数指针
typedef struct
{
CallbackProc pProc;
void *UserData;
}CallBack_t;
void ProcAttch(CallbackProc proc, void* UserData); //注册回调函数
void ProcDetach(); //分离回调函数
- 2、文件1(数据请求和回应)
typedef struct
{
int Fd;
struct1 MsgID; //结构体
char Session[16];
}testStruct_t; //回调处理所需的其余数据
//static修饰函数:使得函数只在本文件内部有效,对其他文件是不可见的
static void func_callback(int A, void *UserData)
{
testStruct_t *ptr = (testStruct_t *)UserData;
int fd = ptr->Fd;
struct1 pMsgHead;
memset(&pMsgHead, 0, sizeof(struct1));
memcpy(&pMsgHead, &ptr->MsgID, sizeof(struct1));
char SessionID[16] = {0};
strncpy(SessionID, ptr->Session, sizeof(SessionID)-1);
//对数据 A、fd、pMsgHead、SessionID进行处理
ProcDetach();
return;
}
int func(int fd, struct1 *pMsgHead)
{
char session[16] = "abcdefg";
//必须加static修饰,保存在全局存储区(静态存储区)。不加就保存在栈区,func函数结束就会释放
static testStruct_t test;
memset(&test, 0, sizeof(testStruct_t));
test.Fd = fd;
memcpy(&test.MsgID, pMsgHead, sizeof(struct1));
strncpy(&test.session, session, sizeof(test.session)-1);
ProcAttch(func_callback, (void*)&test);
return 0;
}
- 3、文件2(升级)
static CallBack_t callback = {0};
void ProcAttch(CallbackProc proc, void* UserData)
{
callback.pProc = proc;
callback.UserData = UserData; //回调处理所需的其余数据
}
void ProcDetach()
{
if(callback.pProc)
{
callback.pProc = NULL;
}
if(callback.UserData)
{
callback.UserData = NULL;
}
}
int Func_test()
{
int progress;
if(callback.pProc && callback.UserData)
{
callback.pProc(progress, callback.UserData); //回调处理所需的其余数据
}
return 0;
}
遇到的错误
- 问题描述
从文件1把testStruct_t(回调处理所需的其余数据)传输到文件2后。在ProcAttch函数中打印callback.UserData的数据和传输过来的数据一致。但是在Func_test函数中再打印callback.UserData就错误了
解决办法:
在文件1中。把testStruct_t test(结构体变量)前加上static修饰。这样变量保存在全局存储区(静态存储区),程序结束后有系统释放。不然就存放在栈区,func函数结束就立即释放了。
static testStruct_t test;