C語言回調和鉤子函數嘛玩意?看這文章,回調和鉤子函數一眼會

c語言基礎 發佈 2020-05-13T07:59:50+00:00

其實從形式上看來確實沒有什麼特別的就是函數指針的應用,不過我們換一個角度,用分層的設計角度再對回調函數進行理解,把Cal函數認為是底層函數,把main看成是上層應用函數,而add和sub認為是上層的方法,現在main要讓底層Cal去進行計算了,而我們的Cal函數再執行過程中發現不

前言

本文主要介紹的是C語言回調函數與鉤子函數的概念,如果你想要從事C/C++ 行業,對於回調函數與鉤子函數肯定會遇到的,很多封裝的API中都存在這樣的函數設計。希望對於廣大讀者學習C/C++有一些幫助。

概念理解

什麼是回調函數?什麼又是鉤子函數?目前對於這兩個概念的定義可能難以理解,在編程的過程中也是有點難區別,因為他們本質上都是屬於函數,只是說是函數的一種應用的形式不同罷了。

不管是鉤子函數還是回調函數為了保持程序的靈活性,大部分都會採用函數指針的方式進行設計,所以一般小夥伴都直接認為是函數指針的一種應用,如果從語法的角度來看,確實是這麼回事,可是我們需要換一個角度去看待一個事物,就像我們之前談面向對象編程,如果你用面向過程的思維方式去理解面向對象的設計是難以理解的,所以這裡的兩個概念也是一樣的。

回調函數

應該很多小夥伴在編程中或者閱讀別人的代碼的時候都會看到callback的字樣,是的,回調函數的英文就是callback Fuction,從字面上來理解 : 反過來調用的函數,那我們就需要知道它本來要去哪裡,它又返回到什麼地方執行,請看以下案例:

其實從形式上看來確實沒有什麼特別的就是函數指針的應用,不過我們換一個角度,用分層的設計角度再對回調函數進行理解,把Cal函數認為是底層函數(也可以說是庫函數),把main看成是上層應用函數,而add和sub認為是上層的方法,現在main要讓底層Cal去進行計算了,而我們的Cal函數再執行過程中發現不知道用什麼方法進行計算,於是他又打道回府去拿到計算的方法,然後獲得最後的結果返回給main,那麼這裡的Sub和Add都認為是回調函數。

鉤子函數

一看到鉤子(Hook)我們首先想到的動作就是掛鈎,作者這裡舉個例子:今天要吃魚,去河邊釣魚,於是我們準備好釣魚竿,終於有魚上鉤了,一看原來是條小魚,於是便放了,繼續釣魚,接著釣了條大魚,於是收工回去吃大餐。

所以鉤子函數看來就相當於一個監測器,在消息傳遞的過程中,捕獲自己感興趣的內容,然後去處理,鉤子函數這個概念在消息機制中經常會提到的,它也是一個函數,一般是通過函數指針進行靈活的註冊,這樣一說,完了,分不清楚了,首先我們還是要選擇好角度,不確定角度真的說不清。

大家可能會發現鉤子函數也是用戶定義的,是不是也可以理解為一個回調函數呢?形式上確實可以認為鉤子函數也是一種回調函數,不過這樣沒有什麼意義,我還可以說他們都是函數呢?還是要從函數的功能上區分,回調函數更多的是目的處理,而鉤子函數更多的是過程監控,對於鉤子函數的應用在rt-thread或者FreeRtos中都使用得非常多。

RT-Thread中截取的鉤子函數代碼參考:

RT-Thread通過一個宏定義來讓用戶決定是否開啟鉤子函數功能,上面每次進入中斷都會調用對應的鉤子函數,具體鉤子函數根據自身需求進行設計,比如統計或者監控等等功能。

尾言

文章都是手打原創,每天最淺顯的介紹C語言、C++,windows知識,喜歡我的文章就關注一波吧,每天帶你學習C/C++不同的知識,也可以看到最新更新和之前發表的文章哦。如果足下基礎比較差,不妨關注下人人都可以學習的視頻教程

《C語言51課視頻教程合集》

《C++45課視頻教程》

通俗易懂,深入淺出,一個視頻只講一個知識點。視頻不深奧,不需要鑽研,在公交、在地鐵、在廁所都可以觀看,隨時隨地漲姿勢。

關鍵字: