问题: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;
}
函数指针和指针函数的区别 参考一下博客:
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
到底指向哪种类型的函数。