天天看點

C語言函數指針之回調函數

我的了解是:把一段可執行的代碼像參數傳遞那樣傳給其他代碼,而這段代碼會在某個時刻被調用執行,這就叫做<code>回調</code>。

如果代碼立即被執行就稱為<code>同步回調</code>,如果過後再執行,則稱之為<code>異步回調</code>。

<code>回調函數</code>就是一個通過函數指針調用的函數。如果你把函數的指針(位址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。

回調函數不是由該函數的實作方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。

因為可以把調用者與被調用者分開,是以調用者不關心誰是被調用者。它隻需知道存在一個具有特定原型和限制條件的被調用函數。

簡而言之,回調函數就是允許使用者把需要調用的方法的指針作為參數傳遞給一個函數,以便該函數在處理相似事件的時候可以靈活的使用不同的方法。

C語言函數指針之回調函數

回調似乎隻是函數間的調用,和普通函數調用沒啥差別。

但仔細看,可以發現兩者之間的一個關鍵的不同:在回調中,主程式把回調函數像參數一樣傳入庫函數。

這樣一來,隻要我們改變傳進庫函數的參數,就可以實作不同的功能,這樣有沒有覺得很靈活?并且當庫函數很複雜或者不可見的時候利用回調函數就顯得十分優秀。

如上述代碼:可以看到,<code>handle()</code>函數裡面的參數是一個指針,在<code>main()</code>函數裡調用<code>handle()</code>函數的時候,給它傳入了函數<code>callback_1()/callback_2()/callback_3()</code>的函數名,這時候的函數名就是對應函數的指針,也就是說,回調函數其實就是函數指針的一種用法。

一個<code>gprs</code>子產品聯網的小項目,使用過的同學大概知道<code>2g、4g、nb</code>等子產品要想實作無線聯網功能都需要經曆子產品上電初始化、注冊網絡、查詢網絡資訊品質、連接配接伺服器等步驟,這裡的的例子就是,利用一個狀态機函數(根據不同狀态依次調用不同實作方法的函數),通過回調函數的方式依次調用不同的函數,實作子產品聯網功能,如下:

是以,如果有人想做個<code>nb</code>子產品聯網項目,可以<code>copy</code>上面的架構,隻需要修改回調函數内部的具體實作,或者增加、減少回調函數,就可以很簡潔快速的實作子產品聯網。

c/c++函數指針與指針函數

c語言指針詳解

繼續閱讀