回调函数及使用方法
回調函數說白了就是事件響應程序,Windows的每個消息可以理解為一個事件,事件的響應代碼要由用戶自己來定義。用戶定義了事件響應的代碼,但還要Windows知道這段代碼的位置(要不然Windows就不知道如何去調用,這也沒有用),于是用戶需要將回調函數的指針告訴Windows,最典型的例子是在窗口類的結構(WNDCLASS)中給lpfnWndProc分量賦回調函數指針值。
? 回調函數的參數格式是由回調函數的調用者(一般是Windows)來定義的,而回調函數的實現者必須遵循這種格式。Windows程序是以事件驅動模型為基礎的,這就必然要用到回調函數這種機制。
? 要透徹了解回調函數,多看看SDK Samples。而MFC中的消息映射機制已經將窗口消息響應的回調函數隱藏起來了,這也符合C++的編程思想,回調函數終究是一種全局函數,它不能在類中實現,而消息映射機制的目的是使消息響應的代碼最終封裝在窗口類(CWnd類的子類)中。
如果有時間,不妨看看MESSAGE_MAP宏,消息映射是回調函數,只是這種回調函數的用法不同而已。普通的回調函數是要你提供地址,傳進某個函數,由它去調用;而消息映射函數,卻是由你定義函數,由MESSAGE_MAP宏去取得地址,并實現它的調用。
回調函數是一個程序員不能顯式調用的函數;通過將回調函數的地址傳給調用者從而實現調用。要實現回調,必須首先定義函數指針。盡管定義的語法有點不可思議,但如果你熟悉函數聲明的一般方法,便會發現函數指針的聲明與函數聲明非常類似。
typedef void (*f1) ();// 為函數指針聲明類型定義
void (*p) (); //p是指向某函數的指針
void func1()?
{
?/* do something */
? printf("From func1(), Hello World!/n");
}
void caller(void(*ptrfunc1)())
{
? ptrfunc1(); /* 調用ptr指向的函數 */?
}
//typedef bool (*f2) (int *);// 為函數指針聲明類型定義
//bool (*q) (int *); //p是指向某函數的指針
bool func2(int* t_i)?
{
? /* do something */
? printf("From func2() = %d, Hello World!/n", (*t_i)++);
? return true;
}
void caller2(bool (*ptrfunc2)(int *), int * i)
{
? ptrfunc2(i); /* 調用ptr指向的函數 */?
}
int main(int argc, char* argv[])
{
?printf("From main(), Hello World!/n");
? printf("/n");
? //無參數調用
?p = func1; /* 傳遞函數地址地址 */
? caller(p); /* 傳遞函數地址到調用者 */
? //有參數調用
?int i = 0;?
? for (int j = 0; j < 10; j++)
?{
? caller2(func2, &i); //* 傳遞函數地址到調用者 */
? }
?//有參數調用第二次
? i = 0;
?//q = func2; /* 傳遞函數地址地址 */
? //caller2(q, &i); /* 傳遞函數地址到調用者 */
?printf("/n");
?printf("From main(), Hello World!/n");
?getchar();
?return 0;
}
轉載于:https://www.cnblogs.com/Vulkan/archive/2012/06/07/7530292.html
總結
- 上一篇: 将SqlServer的数据导出到Exce
- 下一篇: secureCRT/telnet工具使用