如何使用回调函数
一、什么是回調(diào)函數(shù)?
其實(shí)回調(diào)就是一種利用函數(shù)指針進(jìn)行函數(shù)調(diào)用的過程. ?
為什么要用回調(diào)呢?比如我要寫一個子模塊給你用, ??來接收遠(yuǎn)程socket發(fā)來的命令.當(dāng)我接收到命令后, ??需要調(diào)用你的主模塊的函數(shù), ??來進(jìn)行相應(yīng)的處理.但是我不知道你要用哪個函數(shù)來處理這個命令, ? ??我也不知道你的主模塊是什么.cpp或者.h, ??或者說, ??我根本不用關(guān)心你在主模塊里怎么處理它, ??也不應(yīng)該關(guān)心用什么函數(shù)處理它...... ??怎么辦?
使用回調(diào)!
——?lone wolf
?
使用回調(diào)函數(shù)實(shí)際上就是在調(diào)用某個函數(shù)(通常是API函數(shù))時(shí),將自己的一個函數(shù)(這個函數(shù)為回調(diào)函數(shù))的地址作為參數(shù)傳遞給那個函數(shù)。而那個函數(shù)在需要的時(shí)候,利用傳遞的地址調(diào)用回調(diào)函數(shù),這時(shí)你可以利用這個機(jī)會在回調(diào)函數(shù)中處理消息或完成一定的操作。
——?某專家
?
回調(diào)函數(shù),就是由你自己寫的。你需要調(diào)用另外一個函數(shù),而這個函數(shù)的其中一個參數(shù),就是你的這個回調(diào)函數(shù)名。這樣,系統(tǒng)在必要的時(shí)候,就會調(diào)用你寫的回調(diào)函數(shù),這樣你就可以在回調(diào)函數(shù)里完成你要做的事。
——?綠葉
二、如何實(shí)現(xiàn)一個簡單的回調(diào)函數(shù)?
#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"); } int main(void) {callback(10, printWelcome);callback(10, printGoodbye);printWelcome(5); }
用過STL的人都知道,在STL中眾多算法和程序都用到回調(diào)函數(shù),這實(shí)現(xiàn)了一種策略。只要任何符合我的標(biāo)準(zhǔn)的函數(shù)和計(jì)算都可以用我這個公式。你可以實(shí)現(xiàn)各種各樣的回調(diào)函數(shù),只要符合我的格式就能用。
就上面的程序來說,你只要函數(shù)格式符合cllback第二個參數(shù)的格式不論你給別人做飯、鋪床疊被都可以正常工作。這就是回調(diào)的作用,把回調(diào)實(shí)現(xiàn)留給別人。
這是一個用法。
?
有一位朋友用分層的概念來解釋了回調(diào)機(jī)制:callback函數(shù)為B層,main函數(shù)和print*函數(shù)為A層,A層調(diào)用了B層的回調(diào)函數(shù)callmeback,而B層的回調(diào)函數(shù)調(diào)用了A層的實(shí)現(xiàn)函數(shù)print*。說白了B層就是一個接口。
總結(jié)