一個例項學會回撥函式
背景介紹
最近使用回撥函式,此文連線有很詳細的介紹,尤其是兩篇知乎文章,連結如下:
https://blog.csdn.net/yilovexing/article/details/93192484
https://www.zhihu.com/question/19801131/answer/27459821
https://www.zhihu.com/question/19801131/answer/13005983
回撥函式概念
程式設計分為兩類:系統程式設計(system programming)和應用程式設計(application programming)。所謂系統程式設計,簡單來說,就是編寫庫
而應用程式設計就是利用寫好的各種庫來編寫具某種功用的程式,也就是應用。系統程式設計師會給自己寫的庫留下一些介面,即API(application
programming interface,應用程式設計介面),以供應用程式設計師使用。所以在抽象層的圖示裡,庫位於應用的底下。
當程式跑起來時,一般情況下,應用程式(application program)會時常通過API呼叫庫裡所預先備好的函式。但是有些庫函式(library function)
卻要求應用先傳給它一個函式,好在合適的時候呼叫,以完成目標任務。這個被傳入的、後又被呼叫的函式就稱為回撥函式(callback function)。
回撥函式C程式碼例子
你到一個商店買東西,剛好你要的東西沒有貨,於是你在店員那裡留下了你的電話,過了幾天店裡有貨了,店員就打了你的電話,然後你接到電話後就到店裡去取了貨。
在這個例子裡,你的電話號碼就叫回撥函式
,你把電話留給店員就叫登記回撥函式
,店裡後來有貨了叫做觸發回撥事件
,店員給你打電話叫做呼叫回撥函式
,你到店裡去取貨叫做響應回撥事件
。
#include "stdio.h" void buyer1PhoneNumber() //回撥函式 buyer1 { printf("請在有貨的時候聯絡我\n"); //響應回撥函式 } void buyer2PhoneNumber() //回撥函式 buyer2 { printf("請在有貨的時送貨上門\n"); //響應回撥函式 } void salemanCallBack(void (* buyer)()) //店員中間程式 { printf("確定您的取貨方式"); buyer(); } int main(void) //應用程式 { salemanCallBack(buyer1PhoneNumber); //呼叫回撥函式 salemanCallBack(buyer2PhoneNumber); return 0; }
例子說明:
1 應用程式是呼叫回撥函式,即上例中main()函式;
2 回撥函式通過主函式(main)呼叫中間程式介面函式(salemanCallBack),註冊回撥函式;
3 中間程式介面函式(salemanCallBack)呼叫回撥函式(salemanCallBack(buyer1PhoneNumber););
4 回撥函式(buyer1PhoneNumber)響應回撥事件(printf("請在有貨的時候聯絡我\n"); );
響應回撥事件主體是回撥函式本身,響應事件自定義在回撥函式內部。
中間程式可維護成一個系統庫等形式。