天天看點

回調函數

1.回調函數是什麼東西?

2.回調函數怎麼開發,怎麼使用?

3.回調函數的作用,應該在什麼情況下使用?

第一個問題:

*********************************************************************

其實回調就是一種利用函數指針進行函數調用的過程.  

為什麼要用回調呢?比如我要寫一個子子產品給你用,   來接收遠端socket發來的指令.當我接收到指令後,   需要調用你的主子產品的函數,   來進行相應的處理.但是我不知道你要用哪個函數來處理這個指令,     我也不知道你的主子產品是什麼.cpp或者.h,   或者說,   我根本不用關心你在主子產品裡怎麼處理它,   也不應該關心用什麼函數處理它......   怎麼辦?

使用回調!

—— lone wolf

使用回調函數實際上就是在調用某個函數(通常是api函數)時,将自己的一個函數(這個函數為回調函數)的位址作為參數傳遞給那個函數。而那個函數在需要的時候,利用傳遞的位址調用回調函數,這時你可以利用這個機會在回調函數中處理消息或完成一定的操作。

——某專家

回調函數,就是由你自己寫的。你需要調用另外一個函數,而這個函數的其中一個參數,就是你的這個回調函數名。這樣,系統在必要的時候,就會調用你寫的回調函數,這樣你就可以在回調函數裡完成你要做的事。

——綠葉

http://hi.baidu.com/zhuyipeng/blog/item/863fefdb7c736c63d1164eec.html是一篇比較好的文章。

什麼是回調函數?

  回調函數是應用程式提供給windows系統dll或其它dll調用的函數,一般用于截獲消息、擷取系統資訊或處理異步事件。應用程式把回調函數的位址指針告訴dll,而dll在适當的時候會調用該函數。回調函數必須遵守事先規定好的參數格式和傳遞方式,否則dll一調用它就會引起程式或系統的崩潰。通常情況下,回調函數采用标準windowsapi的調用方式,即__stdcall,當然,dll編制者可以自己定義調用方式,但客戶程式也必須遵守相同的規定。在__stdcall方式下,函數的參數按從右到左的順序壓入堆棧,除了明确指明是指針或引用外,參數都按值傳遞,函數傳回之前自己負責把參數從堆棧中彈出。

  了解回調函數!

—— jufengfeng

function pointers provide the concept of callback functions.

—— newty.de

第二個問題:

我實作了一個很簡單的回調函數。

#include <stdio.h>

void printwelcome(int len)

{

      printf("歡迎歡迎 -- %d/n", len);

}

void printgoodbye(int len)

      printf("送客送客 -- %d/n", len);

void callback(int times, void (* print)(int))

      int i;

      for (i = 0; i < times; ++i)

      {

             print(i);

      }

      printf("/n我不知道你是迎客還是送客!/n/n");

void main(void)

      callback(10, printwelcome);

      callback(10, printgoodbye);

      printwelcome(5);

上面的代碼沒有被任何系統函數調用,說明那些東西隻是撒撒土迷迷路人眼而已。還有面相對象程式設計時,用class給封裝起來也是掩人耳目,不要被外表所迷惑。

第三個問題:

用過stl的人都知道,在stl中衆多算法和程式都用到回調函數,這實作了一種政策。隻要任何符合我的标準的函數和計算都可以用我這個公式。你可以實作各種各樣的回調函數,隻要符合我的格式就能用。

就上面的程式來說,你隻要函數格式符合cllback第二個參數的格式不論你給别人做飯、鋪床疊被都可以正常工作。這就是回調的作用,把回調實作留給别人。

這是一個用法。

有一位朋友用分層的概念來解釋了回調機制:callback函數為b層,main函數和print*函數為a層,a層調用了b層的回調函數callmeback,而b層的回調函數調用了a層的實作函數print*。說白了b層就是一個接口。

原文連結:http://blog.csdn.net/callmeback/article/details/4242260

繼續閱讀