電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 87|回復(fù): 0
收起左側(cè)

回調(diào)函數(shù) callback 的實(shí)現(xiàn)原理是什么?

[復(fù)制鏈接]

418

主題

418

帖子

4293

積分

四級(jí)會(huì)員

Rank: 4

積分
4293
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-4 11:45:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
其實(shí)回調(diào)函數(shù)和普通函數(shù)沒有本質(zhì)的區(qū)別。首先讓我們來看看普通的函數(shù)調(diào)用,假設(shè)我們?cè)贏函數(shù)中調(diào)用函數(shù)func:
  • void A() {   ...   func();   ...}想一想,你怎么知道可以調(diào)用func呢?哦,原來func是你自己定義的:
  • void func() {  blablabla;}這很簡(jiǎn)單吧,現(xiàn)在假設(shè)你編寫的這段代碼無比之牛逼,全世界的程序員都無比瘋狂的想引入到自己的項(xiàng)目中,這時(shí)你會(huì)把A函數(shù)編寫成一個(gè)庫供全世界的碼農(nóng)使用。但此時(shí)所有人都發(fā)現(xiàn)一個(gè)問題,那就是他們都想在A函數(shù)中的某個(gè)特定點(diǎn)上執(zhí)行一段自己的代碼,作為這個(gè)庫的創(chuàng)作者你可能會(huì)這樣實(shí)現(xiàn):
  • void A() {   ...    // 特定點(diǎn)      if (張三) {     funcA();   } else if (李四) {     funcB();   }   ...}假設(shè)全世界有一千萬碼農(nóng),那你是不是要有一千萬個(gè)if else。。。想想這樣的代碼就很刺激有沒有!更好的辦法是什么呢?把函數(shù)也當(dāng)做變量!你可以這樣定義A函數(shù):
  • void A(func f) {   ...   f();   ...}任何一個(gè)碼農(nóng)在調(diào)用你的A函數(shù)時(shí)傳入一個(gè)函數(shù)變量,A函數(shù)在合適的時(shí)機(jī)調(diào)用你傳入的函數(shù)變量,從而節(jié)省了一千萬行代碼。為了讓這個(gè)過程更加難懂一些,這個(gè)函數(shù)變量起了一個(gè)無比難懂的稱呼:回調(diào)函數(shù)。現(xiàn)在你應(yīng)該明白了回調(diào)函數(shù)是怎么一回事了吧,相比回調(diào)函數(shù)來說我更愿意將其看做函數(shù)變量。以上就是回調(diào)函數(shù)的基本原理,有想看更詳細(xì)版本的請(qǐng)參考這里。以上僅僅是回調(diào)函數(shù)的一種用途,回調(diào)函數(shù)在基于事件驅(qū)動(dòng)編程以及異步編程時(shí)更是必備的,關(guān)于事件驅(qū)動(dòng)編程你可以參考這里,GUI編程的同學(xué)對(duì)此肯定很熟悉。希望這里的講解對(duì)大家理解回調(diào)函數(shù)有所幫助。------------ END ------------



    ●專欄《嵌入式工具
    ●專欄《嵌入式開發(fā)》
    ●專欄《Keil教程》
    ●嵌入式專欄精選教程

    關(guān)注公眾號(hào)回復(fù)“加群”按規(guī)則加入技術(shù)交流群,回復(fù)“1024”查看更多內(nèi)容。
    點(diǎn)擊“閱讀原文”查看更多分享。
  • 發(fā)表回復(fù)

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表