c++ 传入回调函数 参数没有传入_一文读懂回调函数
1 什么是回調(diào)函數(shù)?
來(lái)自公眾號(hào):C語(yǔ)言與cpp編程
首先什么是“回調(diào)”呢?
我的理解是:把一段可執(zhí)行的代碼像參數(shù)傳遞那樣傳給其他代碼,而這段代碼會(huì)在某個(gè)時(shí)刻被調(diào)用執(zhí)行,這就叫做回調(diào)。
如果代碼立即被執(zhí)行就稱(chēng)為同步回調(diào),如果過(guò)后再執(zhí)行,則稱(chēng)之為異步回調(diào)。
回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)。
回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。
2 為什么要用回調(diào)函數(shù)?
因?yàn)榭梢园颜{(diào)用者與被調(diào)用者分開(kāi),所以調(diào)用者不關(guān)心誰(shuí)是被調(diào)用者。它只需知道存在一個(gè)具有特定原型和限制條件的被調(diào)用函數(shù)。
簡(jiǎn)而言之,回調(diào)函數(shù)就是允許用戶(hù)把需要調(diào)用的方法的指針作為參數(shù)傳遞給一個(gè)函數(shù),以便該函數(shù)在處理相似事件的時(shí)候可以靈活的使用不同的方法。
int?Callback()????///回調(diào)似乎只是函數(shù)間的調(diào)用,和普通函數(shù)調(diào)用沒(méi)啥區(qū)別。
但仔細(xì)看,可以發(fā)現(xiàn)兩者之間的一個(gè)關(guān)鍵的不同:在回調(diào)中,主程序把回調(diào)函數(shù)像參數(shù)一樣傳入庫(kù)函數(shù)。
這樣一來(lái),只要我們改變傳進(jìn)庫(kù)函數(shù)的參數(shù),就可以實(shí)現(xiàn)不同的功能,這樣有沒(méi)有覺(jué)得很靈活?并且當(dāng)庫(kù)函數(shù)很復(fù)雜或者不可見(jiàn)的時(shí)候利用回調(diào)函數(shù)就顯得十分優(yōu)秀。
3 怎么使用回調(diào)函數(shù)?
int?Callback_1(int?a)???///如上述代碼:可以看到,Handle()函數(shù)里面的參數(shù)是一個(gè)指針,在main()函數(shù)里調(diào)用Handle()函數(shù)的時(shí)候,給它傳入了函數(shù)Callback_1()/Callback_2()/Callback_3()的函數(shù)名,這時(shí)候的函數(shù)名就是對(duì)應(yīng)函數(shù)的指針,也就是說(shuō),回調(diào)函數(shù)其實(shí)就是函數(shù)指針的一種用法。
4 回調(diào)函數(shù)實(shí)例(很有用)
一個(gè)GPRS模塊聯(lián)網(wǎng)的小項(xiàng)目,使用過(guò)的同學(xué)大概知道2G、4G、NB等模塊要想實(shí)現(xiàn)無(wú)線(xiàn)聯(lián)網(wǎng)功能都需要經(jīng)歷模塊上電初始化、注冊(cè)網(wǎng)絡(luò)、查詢(xún)網(wǎng)絡(luò)信息質(zhì)量、連接服務(wù)器等步驟,這里的的例子就是,利用一個(gè)狀態(tài)機(jī)函數(shù)(根據(jù)不同狀態(tài)依次調(diào)用不同實(shí)現(xiàn)方法的函數(shù)),通過(guò)回調(diào)函數(shù)的方式依次調(diào)用不同的函數(shù),實(shí)現(xiàn)模塊聯(lián)網(wǎng)功能,如下:
/*********??工作狀態(tài)處理??*********/typedef?struct{?uint8_t?mStatus;?uint8_t?(*?Funtion)(void);?//函數(shù)指針的形式}?M26_WorkStatus_TypeDef;??//M26的工作狀態(tài)集合調(diào)用函數(shù)/************************************************?>M26工作狀態(tài)集合函數(shù)***********************************************/M26_WorkStatus_TypeDef?M26_WorkStatus_Tab[]?={????????{GPRS_NETWORK_CLOSE,??M26_PWRKEY_Off??},?//模塊關(guān)機(jī)????{GPRS_NETWORK_OPEN,??M26_PWRKEY_On??},?//模塊開(kāi)機(jī)????{GPRS_NETWORK_Start,???M26_Work_Init??},?//管腳初始化????{GPRS_NETWORK_CONF,??M26_NET_Config??},?/AT指令配置????{GPRS_NETWORK_LINK_CTC,??M26_LINK_CTC??},?//連接調(diào)度中心??????{GPRS_NETWORK_WAIT_CTC,?M26_WAIT_CTC??},??//等待調(diào)度中心回復(fù)?????{GPRS_NETWORK_LINK_FEM,?M26_LINK_FEM??},?//連接前置機(jī)????{GPRS_NETWORK_WAIT_FEM,?M26_WAIT_FEM??},?//等待前置機(jī)回復(fù)????{GPRS_NETWORK_COMM,??M26_COMM???},?//正常工作????????{GPRS_NETWORK_WAIT_Sig,??M26_WAIT_Sig??},??//等待信號(hào)回復(fù)????{GPRS_NETWORK_GetSignal,??M26_GetSignal??},?//獲取信號(hào)值????{GPRS_NETWORK_RESTART,??M26_RESET???},?//模塊重啟};/************************************************?>M26模塊工作狀態(tài)機(jī),依次調(diào)用里面的12個(gè)函數(shù)???***********************************************/uint8_t?M26_WorkStatus_Call(uint8_t?Start){????uint8_t?i?=?0;????for(i?=?0;?i?所以,如果有人想做個(gè)NB模塊聯(lián)網(wǎng)項(xiàng)目,可以copy上面的框架,只需要修改回調(diào)函數(shù)內(nèi)部的具體實(shí)現(xiàn),或者增加、減少回調(diào)函數(shù),就可以很簡(jiǎn)潔快速的實(shí)現(xiàn)模塊聯(lián)網(wǎng)。
推薦閱讀
C/C++函數(shù)指針與指針函數(shù)
C語(yǔ)言指針詳解
總結(jié)
以上是生活随笔為你收集整理的c++ 传入回调函数 参数没有传入_一文读懂回调函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 直播都需要什么设备(弹幕式互动直播平台)
- 下一篇: 关于 VC 执行顺序