QT中的回调函数

本文解释了QT中void__stdcallRegCallBack回调函数的工作原理,涉及void*作为参数的使用、函数指针的概念以及在C++中如何强制类型转换来调用回调函数。
摘要由CSDN通过智能技术生成
问题:QT中的回调函数void __stdcall RegCallBack(GClient* s, Callback_Type type, void* call);这个回调函数怎么理解?
#include <iostream>
using namespace std;

typedef void(*func)(char* a);

void recallback(void* function(char* a), char *b)
{
	function(b);
}

void zmq_recallback(void* call,char *b)
{
	func abc = (func)(call);

	abc(b);
}

void my_callback(char *msg)
{
	printf("Hello");
	printf("msg:%s\r\n",msg);
}

int main()
{
	char *p = "Hello,world!\r\n";
	
	
	
	//recallback(my_callback,p);
	zmq_recallback(my_callback,p);
	return 0;
}

函数指针和指针函数的区别 参考一下博客:

C/C++函数指针与指针函数-腾讯云开发者社区-腾讯云

1.为什么mycallback可以传给void*call 也可以传给函数指针?

每个函数都有一个入口地址,垓入口地址就是函数指针所指向的地址,有了指向函数的函数指针变量后,可用该函数指针变量调用函数,函数名就是函数的入口地址。

 void*可以指向任意类型的指针,比如int、char型指针,同时也可以指向函数指针

如果把函数名理解成常量函数指针,那么void*就是指向的常量函数指针的指针。所以可以传给void *call 普通指针

函数指针可以指向常量函数指针,所以可以传给函数指针。

也可以换一种方式理解,函数名是函数的入口地址,函数指针是指向函数的入口地址的指针,void类型的普通指针可以指向数据的地址,也可以指向函数地址。

一般情况下,我们都以函数指针作为回调函数的形参,QT中的回调函数void __stdcall RegCallBack(GClient* s, Callback_Type type, void* call);以void*类型的普通指针作为形参,

但是调用函数的时候,c语言语法规定普通指针不能进行调用函数,只能解析,必须强制类型转换成func abc = (func)(call);函数指针才能进行调用。否则编译器无法正确识别call 到底指向哪种类型的函数。

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值