最近在學習回調函數的使用,主要是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);
}