回呼函數(真好理解)__函數

來源:互聯網
上載者:User

回呼函數

 

在看LWIP時,見到用回呼函數,再看某老外公司OPC原始碼時,見到用回呼函數。看我國內某些代碼(我公司軟體等)時沒用到。於是,我對回呼函數產生了很大的好奇。以前,我寫VC程式時用到過回呼函數,但是沒有用C語言來使用。最近,看到國外大量的經典代碼中廣泛使用了回呼函數(LWIP、某兩個公司的OPC程式等),都是C語言來實現的,而不是VC windows程式中別人實現自己使用的那種。

為了弄明白這種函數的奧妙,首先提出三個問題:

1.        回呼函數是什麼東西。

2.        回呼函數怎麼開發,怎麼使用。

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

 

帶著問題來學習,有目的。呵呵,個人經驗。

開啟baidu.com、google.cn搜尋了好多資料,如下:

順便提一下,某君的一個簽名很讓我佩服:1好好活著,因為我們會死很久。2五千年的文明 兩百年的無奈

 

第一個問題:

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

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

為什麼要用回調呢?比如我要寫一個子模組給你用,   來接收遠程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層就是一個介面。

 

 

這是我的理解。Over。

轉自:http://blog.csdn.net/callmeback/article/details/4242260

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.