回調函數

回調函數:
簡而言之,回調函數就是一個經過函數指針調用的函數。
若是你把函數的指針(地址)做爲參數傳遞給另外一個函數,當這個指針被用爲調用它所指向的函數時,咱們就說這是回調函數。算法

爲何要使用回調函數?shell

  由於能夠把調用者與被調用者分開。調用者不關心誰是被調用者,全部它需知道的,只是存在一個具備某種特定原型、某些限制條件(如返回值爲int)的被調用函數。函數

  若是想知道回調函數在實際中有什麼做用,先假設有這樣一種狀況,咱們要編寫一個庫,它提供了某些排序算法的實現,如冒泡排序、快速排序、shell排序、shake排序等等,但爲使庫更加通用,不想在函數中嵌入排序邏輯,而讓使用者來實現相應的邏輯;或者,想讓庫可用於多種數據類型(int、float、string),此時,該怎麼辦呢?可使用函數指針,並進行回調。指針

  回調可用於通知機制,例如,有時要在程序中設置一個計時器,每到必定時間,程序會獲得相應的通知,但通知機制的實現者對咱們的程序一無所知。而此時,就需有一個特定原型的函數指針,用這個指針來進行回調,來通知咱們的程序事件已經發生。實際上,SetTimer() API使用了一個回調函數來通知計時器,並且,萬一沒有提供回調函數,它還會把一個消息發往程序的消息隊列。blog

  另外一個使用回調機制的API函數是EnumWindow(),它枚舉屏幕上全部的頂層窗口,爲每一個窗口調用一個程序提供的函數,並傳遞窗口的處理程序。若是被調用者返回一個值,就繼續進行迭代,不然,退出。EnumWindow()並不關心被調用者在何處,也不關心被調用者用它傳遞的處理程序作了什麼,它只關心返回值,由於基於返回值,它將繼續執行或退出。排序

  無論怎麼說,回調函數是繼續自C語言的,於是,在C++中,應只在與C代碼創建接口,或與已有的回調接口打交道時,才使用回調函數。除了上述狀況,在C++中應使用虛擬方法或函數符(functor),而不是回調函數。接口

 

#include <stdio.h>
 
void printWelcome(int len)
{
       printf("歡迎歡迎 -- %d/n", len);
}
 
void printGoodbye(int len)
{
      
}
 
void callback(int times, void (* print)(int))
{
       int i;
       for (i = 0; i < times; ++i)
       {
              print(i);
       }
      
}
void main(void)
{
       callback(10, printWelcome);
       callback(10, printGoodbye);
       printWelcome(5);
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息