最近在学习回调函数的使用,主要是C中回调函数的使用。
回调函数就是一个通过函数指针调用的函数。如果你把一个函数的指针(地址)作为参数传递给另一个函数,便可以在另外的函数中通过函数指针的方式来调用这个指针指向函数,我们就说这是回调函数。
回调函数不是由该函数的实现方直接调用,而是在特定的事件发生时由另外的一方调用的,用于对该事件或条件进行响应。
一个简单的比方为:当A有事情找B,但是B现在没时间响应A,因此B可以留下A的电话(函数指针),等到B有时间的时候,再通过电话(函数指针)来响应A。这便是回调函数的整个流程。
回调函数在程序调试的时候常常用到,尤其是在纯C的算法程序中。如果将调试信息利用回调函数进行返回,便可以知道是算法的问题还是DSP层或者ARM层的问题,可以避免很多不必要的麻烦。
下面给出回调函数的几个简单例子:
首先给出一个C语言的例子:
//1. 首先申明要实现的函数
void MyFun1(int x);
void MyFun2(int x);
void MyFun3(int x);
//2.定义函数指针的类型,便于后续的使用
typedef void (*FunType)(int);
//3. 申明使用函数指针作为形参的回调函数
int CallMyFun(FunType fp, int x);
//4. 主函数
int main(int argc, char* argv[])
{
//通过回调函数调用申明的函数
int a = CallMyFun(MyFun1, 10);
CallMyFun(MyFun2, 20);
CallMyFun(MyFun3, 30);
return 1;
}
int CallMyFun(FunType fp, int x)
{
fp(x);
return x;
}
void MyFun1(int x)
{
printf("函数MyFun1中输出:%dn", x);
}
void MyFun2(int x)
{
printf("函数MyFun2中输出:%dn", x);
}
void MyFun3(int x)
{
printf("函数MyFun3中输出:%dn", x);
}
在给出一个C++的例子:
#include "stdio.h"
#include "windows.h"
#include "mmsystem.h" // 多媒体定时器需要包含此文件
#pragma comment(lib, "winmm.lib") // 多媒体定时器需要导入此库
void CALLBACK timer_proc(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2) // 定义回调函数
{
printf("time out.n");
}
int main()
{
UINT nId = timeSetEvent( 1000, 0, timer_proc, 0, TIME_CALLBACK_FUNCTION|TIME_PERIODIC); // 注册回调函数
getchar();
timeKillEvent( nId );
return 0;
}
下面一个是关于C++的
#include "stdafx.h"
#include "windows.h"
#include <iostream.h>
//回调函数指针
typedef int(WINAPI* WNDCALLBACK)(int*,int*);
//回调函数
int __stdcall Call(int *a,int *b);
//定义类
class A
{
public:
//比较两个数字大小
int Compare(int m,int n,WNDCALLBACK function)
{
int *a=&m;
int *b=&n;
return (*function)(a,b);
}
};
int main(int argc, char* argv[])
{
int a=10;
int b=6;
A m_a;
cout<<m_a.Compare(a,b,Call)<<endl;
return 0;
}
//回调函数
int CALLBACK Call(int *a,int *b)
{
return *a>(*b)?(*a):(*b);
}