熱線電(dian)話:0755-23712116
郵箱:contact@legoupos.cn
地址:深圳市寶安區沙井街(jie)道后亭茅洲山工業(ye)園工業(ye)大廈全至科技(ji)創新園科創大廈2層2A
我的(de)(de)理解是(shi):把一段可執(zhi)行的(de)(de)代碼(ma)像(xiang)參數(shu)傳(chuan)遞那樣傳(chuan)給其他代碼(ma),而這段代碼(ma)會在某(mou)個時刻被調用執(zhi)行,這就叫做(zuo)回調。
如(ru)(ru)果代碼立即被執(zhi)行就稱為同步回(hui)調(diao),如(ru)(ru)果過后(hou)再執(zhi)行,則稱之為異步回(hui)調(diao)。
回(hui)調(diao)函(han)數(shu)就(jiu)(jiu)是(shi)一(yi)個通過(guo)函(han)數(shu)指針調(diao)用(yong)(yong)的函(han)數(shu)。如(ru)果你把(ba)函(han)數(shu)的指針(地址)作為(wei)參數(shu)傳(chuan)遞給另一(yi)個函(han)數(shu),當這(zhe)個指針被用(yong)(yong)來調(diao)用(yong)(yong)其所(suo)指向的函(han)數(shu)時,我們就(jiu)(jiu)說(shuo)這(zhe)是(shi)回(hui)調(diao)函(han)數(shu)。
回(hui)調函數(shu)不(bu)是由(you)該函數(shu)的實現方(fang)直接調用(yong)(yong),而(er)是在(zai)特定的事(shi)件或條件發生(sheng)時由(you)另外(wai)的一方(fang)調用(yong)(yong)的,用(yong)(yong)于對該事(shi)件或條件進行(xing)響應。
因為可以把調(diao)(diao)用(yong)者(zhe)與被(bei)調(diao)(diao)用(yong)者(zhe)分開,所以調(diao)(diao)用(yong)者(zhe)不關心誰是(shi)被(bei)調(diao)(diao)用(yong)者(zhe)。它只需知道(dao)存(cun)在一(yi)個具有特定原(yuan)型和限制條件的被(bei)調(diao)(diao)用(yong)函(han)數。
簡而言之,回(hui)調函數就是(shi)允許用戶把需(xu)要(yao)調用的方法的指針(zhen)作為參(can)數傳遞給一個(ge)函數,以便該函數在處(chu)理相似事件的時候可以靈活的使用不同(tong)的方法。
回調似乎只是(shi)函數間的調用,和(he)普通函數調用沒啥區別。
但(dan)仔細看,可以發(fa)現兩者之間的一個關鍵的不同(tong):在(zai)回(hui)(hui)調中,主程序(xu)把回(hui)(hui)調函數(shu)像參數(shu)一樣傳(chuan)入庫(ku)函數(shu)。
這樣(yang)一來,只要我們(men)改變傳進(jin)庫函數(shu)的(de)參數(shu),就可以(yi)實現不(bu)同的(de)功能(neng),這樣(yang)有沒有覺得(de)很靈活?并且當庫函數(shu)很復(fu)雜或者不(bu)可見的(de)時候利用回調函數(shu)就顯得(de)十分優秀(xiu)。
如上述(shu)代碼:可(ke)以看到,Handle()函(han)數(shu)(shu)(shu)里面的(de)參(can)數(shu)(shu)(shu)是(shi)一(yi)個指(zhi)針(zhen),在main()函(han)數(shu)(shu)(shu)里調用Handle()函(han)數(shu)(shu)(shu)的(de)時候,給(gei)它傳入(ru)了函(han)數(shu)(shu)(shu)Callback_1()/Callback_2()/Callback_3()的(de)函(han)數(shu)(shu)(shu)名(ming),這時候的(de)函(han)數(shu)(shu)(shu)名(ming)就是(shi)對應函(han)數(shu)(shu)(shu)的(de)指(zhi)針(zhen),也就是(shi)說,回調函(han)數(shu)(shu)(shu)其實就是(shi)函(han)數(shu)(shu)(shu)指(zhi)針(zhen)的(de)一(yi)種用法。
一個GPRS模(mo)塊(kuai)聯網(wang)(wang)(wang)的(de)小項目(mu),使用(yong)過(guo)的(de)同(tong)學大概知道(dao)2G、4G、NB等(deng)模(mo)塊(kuai)要想實現無線聯網(wang)(wang)(wang)功能(neng)都需要經(jing)歷模(mo)塊(kuai)上電(dian)初始化、注(zhu)冊(ce)網(wang)(wang)(wang)絡(luo)、查詢網(wang)(wang)(wang)絡(luo)信(xin)息質量、連接服務器等(deng)步驟,這(zhe)里的(de)的(de)例子就是(shi),利(li)用(yong)一個狀(zhuang)態(tai)機(ji)函數(根據不(bu)同(tong)狀(zhuang)態(tai)依(yi)次調(diao)用(yong)不(bu)同(tong)實現方法的(de)函數),通過(guo)回調(diao)函數的(de)方式依(yi)次調(diao)用(yong)不(bu)同(tong)的(de)函數,實現模(mo)塊(kuai)聯網(wang)(wang)(wang)功能(neng),如下:
所以,如果有人想做個NB模塊聯網(wang)項目(mu),可(ke)以copy上面的框(kuang)架,只需要修改回調函(han)數內部的具體(ti)實現(xian),或者增(zeng)加、減少回調函(han)數,就可(ke)以很簡(jian)潔快速的實現(xian)模塊聯網(wang)。
C/C++函(han)數(shu)指(zhi)針(zhen)與指(zhi)針(zhen)函(han)數(shu)
C語言指針詳解