日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

回调函数及使用方法

發(fā)布時(shí)間:2023/12/9 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回调函数及使用方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
回調(diào)函數(shù)及使用方法

回調(diào)函數(shù)說(shuō)白了就是事件響應(yīng)程序,Windows的每個(gè)消息可以理解為一個(gè)事件,事件的響應(yīng)代碼要由用戶自己來(lái)定義。用戶定義了事件響應(yīng)的代碼,但還要Windows知道這段代碼的位置(要不然Windows就不知道如何去調(diào)用,這也沒(méi)有用),于是用戶需要將回調(diào)函數(shù)的指針告訴Windows,最典型的例子是在窗口類(lèi)的結(jié)構(gòu)(WNDCLASS)中給lpfnWndProc分量賦回調(diào)函數(shù)指針值。
? 回調(diào)函數(shù)的參數(shù)格式是由回調(diào)函數(shù)的調(diào)用者(一般是Windows)來(lái)定義的,而回調(diào)函數(shù)的實(shí)現(xiàn)者必須遵循這種格式。Windows程序是以事件驅(qū)動(dòng)模型為基礎(chǔ)的,這就必然要用到回調(diào)函數(shù)這種機(jī)制。
? 要透徹了解回調(diào)函數(shù),多看看SDK Samples。而MFC中的消息映射機(jī)制已經(jīng)將窗口消息響應(yīng)的回調(diào)函數(shù)隱藏起來(lái)了,這也符合C++的編程思想,回調(diào)函數(shù)終究是一種全局函數(shù),它不能在類(lèi)中實(shí)現(xiàn),而消息映射機(jī)制的目的是使消息響應(yīng)的代碼最終封裝在窗口類(lèi)(CWnd類(lèi)的子類(lèi))中。

如果有時(shí)間,不妨看看MESSAGE_MAP宏,消息映射是回調(diào)函數(shù),只是這種回調(diào)函數(shù)的用法不同而已。普通的回調(diào)函數(shù)是要你提供地址,傳進(jìn)某個(gè)函數(shù),由它去調(diào)用;而消息映射函數(shù),卻是由你定義函數(shù),由MESSAGE_MAP宏去取得地址,并實(shí)現(xiàn)它的調(diào)用。

回調(diào)函數(shù)是一個(gè)程序員不能顯式調(diào)用的函數(shù);通過(guò)將回調(diào)函數(shù)的地址傳給調(diào)用者從而實(shí)現(xiàn)調(diào)用。要實(shí)現(xiàn)回調(diào),必須首先定義函數(shù)指針。盡管定義的語(yǔ)法有點(diǎn)不可思議,但如果你熟悉函數(shù)聲明的一般方法,便會(huì)發(fā)現(xiàn)函數(shù)指針的聲明與函數(shù)聲明非常類(lèi)似。

typedef void (*f1) ();// 為函數(shù)指針聲明類(lèi)型定義
void (*p) (); //p是指向某函數(shù)的指針
void func1()?
{
?/* do something */
? printf("From func1(), Hello World!/n");
}

void caller(void(*ptrfunc1)())
{
? ptrfunc1(); /* 調(diào)用ptr指向的函數(shù) */?
}

//typedef bool (*f2) (int *);// 為函數(shù)指針聲明類(lèi)型定義
//bool (*q) (int *); //p是指向某函數(shù)的指針

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); /* 調(diào)用ptr指向的函數(shù) */?
}


int main(int argc, char* argv[])
{
?printf("From main(), Hello World!/n");
? printf("/n");

? //無(wú)參數(shù)調(diào)用
?p = func1; /* 傳遞函數(shù)地址地址 */
? caller(p); /* 傳遞函數(shù)地址到調(diào)用者 */

? //有參數(shù)調(diào)用
?int i = 0;?
? for (int j = 0; j < 10; j++)
?{
? caller2(func2, &i); //* 傳遞函數(shù)地址到調(diào)用者 */
? }

?//有參數(shù)調(diào)用第二次

? i = 0;
?//q = func2; /* 傳遞函數(shù)地址地址 */
? //caller2(q, &i); /* 傳遞函數(shù)地址到調(diào)用者 */

?printf("/n");
?printf("From main(), Hello World!/n");

?getchar();

?return 0;
}


轉(zhuǎn)載于:https://www.cnblogs.com/Vulkan/archive/2012/06/07/7530292.html

總結(jié)

以上是生活随笔為你收集整理的回调函数及使用方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。