国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言函數的回調函數

工程師 ? 來源:嵌入式客棧 ? 作者:嵌入式客棧 ? 2020-09-11 09:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

來源:嵌入式客棧

1 什么是回調函數?首先什么是“回調”呢?

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

如果代碼立即被執行就稱為同步回調,如果過后再執行,則稱之為異步回調。

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

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

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

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

int Callback() ///《 回調函數{ // TODO return 0;}int main() ///《 主函數{ // TODO Library(Callback); ///《 庫函數通過函數指針進行回調 // TODO return 0;}

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

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

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

3 怎么使用回調函數?int Callback_1(int a) ///《 回調函數1{ printf(“Hello, this is Callback_1: a = %d ”, a); return 0;}int Callback_2(int b) ///《 回調函數2{ printf(“Hello, this is Callback_2: b = %d ”, b); return 0;}int Callback_3(int c) ///《 回調函數3{ printf(“Hello, this is Callback_3: c = %d ”, c); return 0;}int Handle(int x, int (*Callback)(int)) ///《 注意這里用到的函數指針定義{ Callback(x);}int main(){ Handle(4, Callback_1); Handle(5, Callback_2); Handle(6, Callback_3); return 0;}

如上述代碼:可以看到,Handle()函數里面的參數是一個指針,在main()函數里調用Handle()函數的時候,給它傳入了函數Callback_1()/Callback_2()/Callback_3()的函數名,這時候的函數名就是對應函數的指針,也就是說,回調函數其實就是函數指針的一種用法。

4 回調函數實例(很有用)一個GPRS模塊聯網的小項目,使用過的同學大概知道2G、4G、NB等模塊要想實現無線聯網功能都需要經歷模塊上電初始化、注冊網絡、查詢網絡信息質量、連接服務器等步驟,這里的的例子就是,利用一個狀態機函數(根據不同狀態依次調用不同實現方法的函數),通過回調函數的方式依次調用不同的函數,實現模塊聯網功能,如下:

/********* 工作狀態處理 *********/typedef struct{ uint8_t mStatus; uint8_t (* Funtion)(void); //函數指針的形式} M26_WorkStatus_TypeDef; //M26的工作狀態集合調用函數/************************************************ 》M26工作狀態集合函數***********************************************/M26_WorkStatus_TypeDef M26_WorkStatus_Tab[] ={ {GPRS_NETWORK_CLOSE, M26_PWRKEY_Off }, //模塊關機 {GPRS_NETWORK_OPEN, M26_PWRKEY_On }, //模塊開機 {GPRS_NETWORK_Start, M26_Work_Init }, //管腳初始化 {GPRS_NETWORK_CONF, M26_NET_Config }, /AT指令配置 {GPRS_NETWORK_LINK_CTC, M26_LINK_CTC }, //連接調度中心 {GPRS_NETWORK_WAIT_CTC, M26_WAIT_CTC }, //等待調度中心回復 {GPRS_NETWORK_LINK_FEM, M26_LINK_FEM }, //連接前置機 {GPRS_NETWORK_WAIT_FEM, M26_WAIT_FEM }, //等待前置機回復 {GPRS_NETWORK_COMM, M26_COMM }, //正常工作 {GPRS_NETWORK_WAIT_Sig, M26_WAIT_Sig }, //等待信號回復 {GPRS_NETWORK_GetSignal, M26_GetSignal }, //獲取信號值 {GPRS_NETWORK_RESTART, M26_RESET }, //模塊重啟}/************************************************ 》M26模塊工作狀態機,依次調用里面的12個函數 ***********************************************/uint8_t M26_WorkStatus_Call(uint8_t Start){ uint8_t i = 0; for(i = 0; i 《 12; i++) { if(Start == M26_WorkStatus_Tab[i].mStatus) { return M26_WorkStatus_Tab[i].Funtion(); } } return 0;}

所以,如果有人想做個NB模塊聯網項目,可以copy上面的框架,只需要修改回調函數內部的具體實現,或者增加、減少回調函數,就可以很簡潔快速的實現模塊聯網。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    183

    文章

    7644

    瀏覽量

    145569
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67499
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    函數指針與調函數解讀

    函數指針是指向函數的指針變量。通過函數指針C語言可以實現各種強大的功能與設計方法。而回調
    發表于 01-19 07:34

    C語言調函數原來這么簡單

    ” 這個概念,它是調函數能夠實現的重要基礎。 1、函數指針學習過C語言的伙伴都知道,
    發表于 12-30 06:45

    調函數例子的應用

    1、一個四則運算的簡單調函數例子: #include #include /**************************************** * 函數指針結
    發表于 12-11 07:23

    怎么使用回調函數

    : b = %d \", b); return 0; } int Callback_3(int c)///< 調函數3 { printf(\"Hello
    發表于 12-11 06:22

    大彩講堂:VisualHMI-LUA教程-on_screen_change調函數使用指南

    on_screen_change調函數使用指南
    的頭像 發表于 08-31 16:32 ?923次閱讀
    大彩講堂:VisualHMI-LUA教程-on_screen_change<b class='flag-5'>回</b><b class='flag-5'>調</b><b class='flag-5'>函數</b>使用指南

    大彩講堂:VisualHMI-LUA教程-on_update調函數使用指南

    調函數使用指南
    的頭像 發表于 08-31 16:25 ?870次閱讀
    大彩講堂:VisualHMI-LUA教程-on_update<b class='flag-5'>回</b><b class='flag-5'>調</b><b class='flag-5'>函數</b>使用指南

    C語言中的內聯函數與宏

    C編程中,內聯函數和宏都用于避免函數調用的開銷并編寫可復用的邏輯部分,但它們在工作方式和安全性方面存在顯著差異。
    的頭像 發表于 07-25 15:10 ?1909次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的內聯<b class='flag-5'>函數</b>與宏

    大彩講堂:VisualHMI-LUA教程-on_press調函數使用指南

    一、適合范圍本文檔適用于VisualHMI平臺,Lua腳本語言為V5.3版本,配合工程可以完成大部分的內部邏輯處理。二、概述on_press(state,x,y)觸摸回調函數,當帶觸摸的串口屏,點擊
    的頭像 發表于 07-23 16:32 ?1207次閱讀
    大彩講堂:VisualHMI-LUA教程-on_press<b class='flag-5'>回</b><b class='flag-5'>調</b><b class='flag-5'>函數</b>使用指南

    大彩講堂:VisualHMI-LUA教程-on_run調函數使用指南

    一、適合范圍本文檔適用于VisualHMI平臺,Lua腳本語言為V5.3版本,配合工程可以完成大部分的內部邏輯處理。二、概述on_run(screen)周期調函數,用該回
    的頭像 發表于 07-23 15:25 ?1136次閱讀
    大彩講堂:VisualHMI-LUA教程-on_run<b class='flag-5'>回</b><b class='flag-5'>調</b><b class='flag-5'>函數</b>使用指南

    為什么中斷調函數中不能使用接收中斷開啟函數?

    我看(書是基于stm32f407編寫)書上說在串口接收中斷調函數里面不能使用 接收中斷開啟函數,書上是利用自己創建了空閑中斷
    發表于 05-28 07:19

    如何使用自定義設置調函數?

    你好,我正在嘗試編寫自己的自定義設置調函數,并使用 fastEnum=false。 是否有任何代碼示例或資料可供我參考? void CyU3PUsbRegisterSetupCallback
    發表于 05-21 06:11

    為什么中斷調函數中不能使用接收中斷開啟函數?

    我看(書是基于stm32f407編寫)書上說在串口接收中斷調函數里面不能使用 接收中斷開啟函數,書上是利用自己創建了空閑中斷
    發表于 04-22 08:19

    為什么不需要給調函數傳遞參數

    調函數C語言里面一個重要機制。
    的頭像 發表于 04-15 10:11 ?835次閱讀

    函數指針的六個常見應用場景

    應用場景,并結合示例代碼進行講解。01、調函數:解耦代碼,提高靈活性調函數是嵌入式開發中最常
    的頭像 發表于 04-07 11:58 ?1475次閱讀
    <b class='flag-5'>函數</b>指針的六個常見應用場景

    解鎖TSMaster fifo函數:報文讀取的高效方法

    前言:TSMaster目前有兩種讀取報文的模式:調函數模式和fifo模式。fifo函數是TSMaster近期新增的函數,本文將重點介紹fi
    的頭像 發表于 03-14 20:04 ?1143次閱讀
    解鎖TSMaster fifo<b class='flag-5'>函數</b>:報文讀取的高效方法