回调函数

        回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

                                                                                                                                                                                                      --来之百度百科的说明微笑

         

        举个例子:我们现在有一个接口传入了时间参数,但是有两个客户他们并不关注怎么去获取时间,只要有时间供他们展示就可以了,而他们要打印的时间格式不一样,一种是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 传递时间参数


我们可以看到这种底层和上层互不关心又互相配合的方式就是回调函数经常会出现的地方



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值