星期一, 3月 13, 2017

[ C ] Callback Function使用


如果在程式裡,使用某個function,叫call function,是主動的行為。
而callback function是被動的,像是某個特定的事件被呼叫到時,
callback function才會被呼叫。

可以想像成,
如果要打電話找某人時,
撥1的話會轉接到A先生,
撥2的話會轉接到B先生,
撥3的話會轉接到C先生,
而不變的是"電話"這台東西永遠是電話,
會變的是你要撥幾號,
等完你撥號後,就會自動接通哪個人。
但要記得你撥的"內容"需要符合電話可以接通的"格式"。

function pointer的定義:

返回類型 (* 函式指標名稱) (參數列表);
int (* GetPointCallback)(int x, int y);

我宣告一個function當例子,

int showMSG(MyID *myid)

當然可以像一般的方式來使用這function,

showMSG(&getID);

但也可以用callback的方式來使用,
先定義一個callback function,回傳一個int值,參數是struct MyID,

int (* CALLBACK)(MyID *);

然後我指定CALLBACK這名字,assign一個function name給他,

CALLBACK = showMSG;

代表我要去使用showMSG這個function。
最後我直接呼叫CALLBACK這個function,那他就會自動連結到showMSG了。

int rel = CALLBACK(&getID);

SourceCode

另外要說的是有其他幾種使用callback function的方法,
第一種是以上說過的方式,
直接宣告給他一個callback的模組,並讓它assign到function內去。

int (*call)(int, int);
call = do_multiply;

第二種是在function用當作參數來使用,
我直接把callback function的宣告當參數放在function內,
然後要使用時,把要用的function name當參數值丟過去,

void redirect_func(int (*call_this)(int, int)){}

redirect_func(do_multiply);

第三種是用typedef的方式來定義callback function的別名,
這種方式和第二種有點像,只是我用typedef的方式,
那我就不用在function參數裡寫那麼多定義了。

typedef int (*call_def)(int, int);

void type_redirect_func(call_def call_this){}

type_redirect_func(do_multiply);


SourceCode 2


Ref
Ref 2
Ref 3

沒有留言: