回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
--来之百度百科的说明
举个例子:我们现在有一个接口传入了时间参数,但是有两个客户他们并不关注怎么去获取时间,只要有时间供他们展示就可以了,而他们要打印的时间格式不一样,一种是YYYY-MM-DD HH:mm:SS 一种是YYYYMMDDHHmmss, 作为底层我们可能经过一系列的操作获得了程序时间的信息,相反要怎么去展示我们并不想关注,于是打算交给上层调用者去实现,那么这个时候就可以使用回调函数来解决这一个问题。代码设计如下:
typedef void (*PrintfTimeInfo)(int nyear,int nmonth,int nday,int nhour,int nmin ,int nsecond);
void DealShowTime( PrintfTimeInfo pFunc)
{
// 经过一系列操作我们获得了时间信息
int nyear=2012;
int nmonth=9;
int nday=20;
int nhour=00;
int nmin= 07;
int nsecond=20;
pFunc(nyear, nmonth, nday, nhour, nmin , nsecond);
}
void Client1Show(int nyear,int nmonth,int nday,int nhour,int nmin ,int nsecond)
{
printf("%04d-%02d-%02d %02d:%02d:%02d\n",nyear, nmonth, nday, nhour, nmin , nsecond);
}
void Client2Show(int nyear,int nmonth,int nday,int nhour,int nmin ,int nsecond)
{
printf("%04d%02d%02d%02d%02d%02d\n",nyear, nmonth, nday, nhour, nmin , nsecond);
}
int _tmain(int argc, _TCHAR* argv[])
{
//客户1 执行的操作
DealShowTime( Client1Show );
//客户2 执行的操作
DealShowTime( Client2Show );
getchar();
return 0;
}
输出
相反,如果现在我们需要知道怎么展示时间,但是并不关注时间是如何获得的,或者不关心时间是什么(当前时间? 闹钟的时间?),那么可以定义如下:
typedef void (*GetTimeInfo)(int &nyear,int &nmonth,int &nday,int &nhour,int &nmin ,int &nsecond);
void ShowTime(GetTimeInfo pFunc)
{
int nyear=0;
int nmonth=0;
int nday=0;
int nhour=0;
int nmin= 0;
int nsecond=0;
pFunc(nyear, nmonth, nday, nhour, nmin , nsecond);
printf("%04d-%02d-%02d %02d:%02d:%02d\n",nyear, nmonth, nday, nhour, nmin , nsecond);
}
void SetClockTime(int &nyear,int &nmonth,int &nday,int &nhour,int &nmin ,int &nsecond)
{
nyear=2012;
nmonth=9;
nday=20;
nhour=00;
nmin= 07;
nsecond=20;
}
#include <time.h>
void GetCurrTimeInfo(int &nyear,int &nmonth,int &nday,int &nhour,int &nmin ,int &nsecond)
{
time_t tcur = time(0);
struct tm *scurtm;
scurtm=localtime(&tcur);
nyear=scurtm->tm_year+1900;
nmonth=scurtm->tm_mon+1;
nday=scurtm->tm_mday;
nhour=scurtm->tm_hour;
nmin= scurtm->tm_min;
nsecond=scurtm->tm_sec;
}
int main(char * argv[] ,int argc)
{
ShowTime(GetCurrTimeInfo);
ShowTime(SetClockTime);
getchar();
return 0;
}
输出:
当然第二个例子只是为了说明而用,可能有人会说 setclocktime 没有传参,实际的工作中我们会将 定义为
typedef void (*GetTimeInfo)(int &nyear,int &nmonth,int &nday,int &nhour,int &nmin ,int &nsecond,void * timeinfo);
由timeinfo 传递时间参数