1. 程式人生 > >濤哥大講堂 之 回撥函式的作用

濤哥大講堂 之 回撥函式的作用

1.什麼是回撥函式

簡單的說就是:函式指標變數可以作為某個函式的引數, 回撥函式就是一個通過函式指標來呼叫的函式

以下是自知乎作者常溪玲的解說:

你到一個商店買東西,剛好你要的東西沒有貨,於是你在店員那裡留下了你的電話,過了幾天店裡有貨了,店員就打了你的電話,然後你接到電話後就到店裡去取了貨。在這個例子裡,你的電話號碼就叫回調函式,你把電話留給店員就叫登記回撥函式,店裡後來有貨了叫做觸發了回撥關聯的事件,店員給你打電話叫做呼叫回撥函式,你到店裡去取貨叫做響應回撥事件。

詳細瞭解請見連結:

2.回撥函式的作用與濤哥的對話

【我】:我看xxx有那種callback機制, 把一個函式地址傳下來, 記錄到某個地方, 然後某個條件滿足的時候去呼叫, 這跟直接呼叫有啥區別呢?

【濤哥】:呼叫callback的時機是不固定的啊

【我】:那時機到了我直接呼叫函式也可以啊, callback也是呼叫的同一個函式啊, 只是寫法不同

【濤哥】:但是這個函式你是不知道的啊, 是哪個函式, 是不確定的啊

【我】:對, 差別應該就是在這了, 如果函式也是我自己寫的那就沒啥區別了吧

【濤哥】:這本來就不是給自己寫的準備的, 介面是對外的

【濤哥】:比如你要寫一個功能, 就是下載http資料

資料下載完過後, 怎麼給使用者呢?

這就可以整個函式:

bool download_start(char* url, void(*callback)(char* data, int len))

所有人都可以用你這個函式download_start, 而所有人都可以註冊回撥, 這個回撥函式不一定是固定的某一個

比如使用者1可以這樣用:

static void imgDataCb(char* data, int len)

{

...

}

main()

{

download_start("http://xxx", imgDataCb);

}

比如使用者2可以這樣用:

static void pictureDataCb(char* data, int len)

{

...

}

main()

{

download_start("http://xxx", pictureDataCb);

}

而你作為介面設計者來說, 你怎麼知道使用者是用函式imgDataCb還是pictureDataCb呢?

即便你知道使用者的函式名, 你作為庫函式也呼叫不到他們的函式啊

3.回撥函式小例子

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <strings.h>
  4 #include <string.h>
  5 
  6 int getNextRandomValue(void)
  7 {
  8     return rand();
  9 }
 10 
 11 void populateArray(int* array, int arraySize, int (*getNextValue)(void))
 12 {
 13     int i = 0;
 14     for(i = 0; i < arraySize; i++)
 15     {
 16         array[i] = getNextValue();
 17     }
 18     return;
 19 }
 20 
 21 int main(void)
 22 {
 23     int myArray[10] = {0};
 24     int i = 0;
 25     populateArray(myArray, 10, getNextRandomValue);
 26     for(i = 0; i < 10; i++)
 27     {
 28         printf("myArray[%d] = %d\n", i, myArray[i]);
 29     }
 30     return 0;
 31 }
[email protected]:/shiyan/shiyan285# 
[email protected]:/shiyan/shiyan285# 
[email protected]:/shiyan/shiyan285# 
[email protected]:/shiyan/shiyan285# 
[email protected]:/shiyan/shiyan285# gcc callback.c
[email protected]:/shiyan/shiyan285# ./a.out
myArray[0] = 1804289383
myArray[1] = 846930886
myArray[2] = 1681692777
myArray[3] = 1714636915
myArray[4] = 1957747793
myArray[5] = 424238335
myArray[6] = 719885386
myArray[7] = 1649760492
myArray[8] = 596516649
myArray[9] = 1189641421
[email protected]:/shiyan/shiyan285# 

相關推薦

大講堂 函式作用

1.什麼是回撥函式 簡單的說就是:函式指標變數可以作為某個函式的引數, 回撥函式就是一個通過函式指標來呼叫的函式 以下是自知乎作者常溪玲的解說: 你到一個商店買東西,剛好你要的東西沒有貨,於是你在店員那裡留下了你的電話,過了幾天店裡有貨了,店員就打了你的電話,然後你接到

Zookeeper C API函式

監視回撥函式 原型: Typedef void (*watcher_fn)(zhandle_t *zh, int type, int state, const char *path, void *watcherCtx); 監視函式原型的各個引數說明如下:

Zookeeper C API函式

監視回撥函式 原型: Typedef void (*watcher_fn)(zhandle_t *zh, int type, int state, const char *path, void *watcherCtx); 監視函式原型的各個引數說明如下:

Node.js實戰(八)函式

Node.js 非同步程式設計的直接體現就是回撥。 非同步程式設計依託於回撥來實現,但不能說使用了回撥後程序就非同步化了。 回撥函式在完成任務後就會被呼叫,Node 使用了大量的回撥函式,Node 所有 API 都支援回撥函式。 例如,我們可以一邊讀取檔案,一邊執行其他命令,在檔案讀取完成後,我們將檔案

C++學習 C/C++函式

 在理解“回撥函式”之前,首先討論下函式指標的概念。 函式指標 (1)概念:指標是一個變數,是用來指向記憶體地址的。一個程式執行時,所有和執行相關的物件都是需要載入到記憶體中,這就決定了程式執行時的任何物件都可以用指標來指向它。函式是存放在記憶體程式碼區域內的,它們同樣有地

jquery函式及jsonp

回到前端,今天講一下jsonp的用法,不過在這之前先講一下跨域和回撥函式吧。 跨域:簡單來說,就說不同的域名之間的訪問,其中域名註冊涉及到傳輸協議、ip地址、埠等;具體可以參考:http://blog

函式呼叫函式

重新回到CSDN,工作以來寫第一個部落格。不碼程式碼,不追求高大上的專業術語,只求通俗的理解。 以前聽過回撥函式,也研究過,但由於沒有在實際中用過,所以也沒太懂,每次一聽到回撥函式這個詞,感覺很高大上,最近在工作上遇到了,而且被公司前輩廣而用之,這說明這個東西並不高大上,反

【BLE】CC2541函式

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程中simpleBLECentralEventCB函式,來簡要說明回撥函式的定義和呼叫過程。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編

CC2541函式程式碼解析

轉自:香瓜部落格回撥函式,解析程式碼: 一 、定義一個 “ 成員為函式指標 ” 的結構體 1 )定義一個函式指標 /** * Central Event Callback Function */ typedef void (*pfnGapCentralRoleEventCB

JS函式(callback)

1.什麼是回撥函式?   -- 簡單點說,一個函式被作為引數傳遞給另一個函式(在這裡我們把另一個函式叫做“otherFunction”),回撥函式在otherFunction中被呼叫。   --可以是匿名函式也可以是命名函式 2.回撥函式的特點   (1)自己定義的函式   (2)你沒有呼叫   (

emWin介面庫注意事項自定義函式之後,控制代碼為0

        由於在嵌入式裝置上可供使用的介面庫很少,專案當中所使用的介面庫為德國SEGGER公司開發的emWin介面庫。使用上和windows的GDI大致類似,也提供了豐富的API介面。如果我們需要對控制元件進行自繪的話,一定要進行的一個操作是通過設定回撥

一文搞懂:詞法作用域、動態作用域、函式、閉包

不管什麼語言,我們總要學習作用域(或生命週期)的概念,比如常見的稱呼:全域性變數、包變數、模組變數、本地變數、區域性變數等等。不管如何稱呼這些作用域的範圍,實現它們的目的都一樣: (1)為了避免名稱衝突; (2)為了限定變數的生命週期(本文以變數名說事,其它的名稱在規則上是一樣的)

JSCallback function(函式

1.概念: 從概念上講,回撥函式與普通函式的本質在於:呼叫者的不同。普通函式由程式設計師程式碼呼叫,而回調函式由作業系統在適當的時間呼叫。   回撥函式主要用於處各種事件和處理。由於WINDOWS系統中存在大量程式設計師事先不可知的事件,例如滑鼠的單擊,程式設計師事先無法得知終

PHP、匿名函式與閉包

回撥函式:通俗的解釋就是把函式作為引數傳入進另一個函式中使用;PHP中有許“需求引數為函式”的函式,像array_map,usort,call_user_func_array之類,他們執行傳入的函式,然後直接將結果返回主函式。好處是函式作為值使用起來方便,而且程式碼簡潔,可讀

layuiajax--函式

問題:一個簡單的AJAX提交表單操作,經常發生後臺資料儲存好了,前端layer彈出層沒有關閉,父頁面沒有重新整理,定位發現是回撥函式沒有執行!!!用Google Chrome瀏覽器這種現象較少,而Safari 和 firefox瀏覽器100%發生。 解決過程:困擾了很久,以

javascript--函式基礎(函式的定義/作用域,函式,即時函式,內部(私有)函式,返回函式函式,重寫自己的函式

函式源於數學對映運算,它定義了一種關係,這種關係使一個集合裡的每一個元素對應到另一個(可能相同的)集合裡的唯一元素 javascript中: 函式是程式碼塊,一段被封閉嚴實的程式碼塊 函式是資料:使用者可以把函式作為 值 賦值給 變數 函式是一種物件,它是一類抽象類(建構函式),所有

Python學習【第21篇】:程序池以及函式 python併發程式設計多程序2-------------資料共享及程序池和函式

python併發程式設計之多程序2-------------資料共享及程序池和回撥函式 一、資料共享 1.程序間的通訊應該儘量避免共享資料的方式 2.程序

Qt 學習路 2(19):事件的接受與忽略(當重寫事件回撥函式時,時刻注意是否需要通過呼叫父類的同名函式來確保原有實現仍能進行!有好幾個例子。為什麼要這麼做?而不是自己去手動呼叫這兩個函式呢?因為我們無法確認父類中的這個處理函式有沒有額外的操作)

版本: 2012-09-29 2013-04-23 更新有關accept()和ignore()函式的相關內容。 2013-12-02 增加有關accept()和ignore()函式的示例。 上一章我們介紹了有關事件的相關內容。我們曾經提到,事件可以依情況接受和忽略。現在,我們就

C語言學習及應用筆記七:C語言中的函式及使用方式

  我們在使用C語言實現相對複雜的軟體開發時,經常會碰到使用回撥函式的問題。但是回撥函式的理解和使用卻不是一件簡單的事,在本篇我們根據我們個人的理解和應用經驗對回撥函式做簡要的分析。 1、什麼是回撥函式   既然談到了回撥函式,首先我們就要搞清楚什麼是回撥函式。在討論回撥函式之前,我們需要說明另一個概念,

quick-cocos2dx-lua精靈移動後的函式

請您先把目光集中在下面這個一行程式碼的移動方法上: transition.moveTo(node, {x = x, y = y, time = 1}) 我之前一直在用上面這種方法,剛剛開始還覺得用