原文地址:https://www.cnblogs.com/jontian/p/5619641.html
回调函数主要结构有三部分组成:主函数、调用函数和被调函数。C语言中,被调函数通常以函数指针(指向对应函数的入口地址)的形式出现。
这里给出一个最简单的回调函数结构,并解析相关数据结构。
//定义回调函数
void PrintfText()
{
printf("Hello World!\n");
}
//定义实现回调函数的"调用函数"
void CallPrintfText(void (*callfuct)())
{
callfuct();
}
//实现函数回调
int main(int argc,char* argv[])
{
CallPrintfText(PrintfText);
return 0;
}
调用函数向其函数中传递 void (*callfuct)(void) 这是一个 void callfuct(void) 函数的入口地址,即PC指针可以通过移动到该地址执行void callfuct(void) 函数,可以通过类比数组来理解。
实现函数调用中,函数调用了“调用函数”,再在其中进一步调用被“调用函数”。相比于主函数直接调用“被调函数”,这种方法为使用者,而不是开发者提供了灵活的接口。另外,函数入口可以像变量一样设定同样为开发者提供了灵活性。
在python中对c++代码中的函数进行回调的情况也很多,这种时候需要首先使用CFUNCTYPE()来首先进行回调函数的类型声明;
比如:
demo = CDLL("filename.dll") #加载dll代码,可以利用python调用c++代码
rev_mess = CFUNCTYPE(c_void_p,c_int,c_int,c_void_p)
oncallback = rev_mess(callback) #其中callback是函数名即引用;
demo.print_txt(oncallback) #将回调函数传到底层的c++代码中