代码之回调函数的用法一

使用场景

在回调某些数据(如:一个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;
}

遇到的错误

- 问题描述

文件1testStruct_t(回调处理所需的其余数据)传输到文件2后。在ProcAttch函数打印callback.UserData的数据和传输过来的数据一致。但是在Func_test函数中再打印callback.UserData就错误了

解决办法

在文件1中。把testStruct_t test(结构体变量)前加上static修饰。这样变量保存在全局存储区(静态存储区),程序结束后有系统释放。不然就存放在栈区func函数结束就立即释放了。

static testStruct_t test;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C++中,回调函数内如何传值到回调函数可以通过以下两种方法实现: 方法一:使用函数参数传递值。在回调函数的参数列表中添加需要传递的值,并在调用回调函数时传入相应的参数。例如: ```c++ typedef void (*CallbackFunc)(int value); // 定义回调函数类型 void callback(int value) // 回调函数 { // 在回调函数内部使用传入的value值 // ... } void doSomething(CallbackFunc cb) // 接受回调函数作为参数的函数 { int value = 10; // 需要传递的值 cb(value); // 调用回调函数并传入值 } int main() { doSomething(callback); // 传入回调函数 return 0; } ``` 方法二:使用类的成员变量来传递值。在定义回调函数时,将回调函数设置为类的静态成员函数,并在类内部设置一个静态成员变量,用于存储需要传递的值。在回调函数中,可以通过访问该静态成员变量来获取传递的值。例如: ```c++ class MyClass { static int value; // 静态成员变量用于传递值 static void callback(); public: static void setValue(int val) { value = val; // 设置需要传递的值 } static void doSomething() { callback(); // 调用回调函数 } }; int MyClass::value = 0; // 初始化静态成员变量 void MyClass::callback() { // 在回调函数内部使用静态成员变量value // ... } int main() { MyClass::setValue(10); // 设置传递的值 MyClass::doSomething(); // 执行回调函数 return 0; } ``` 通过上述方法,可以在C++中实现回调函数内的值传递。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈海平20220310

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值