2015年8月5日 星期三

[C/C++] callback function



什麼叫做 callback function

一般來說 callback function 有兩大特徵

1. callback function 是 programmer 寫的
2. callback function 多半不是給programmer 呼叫的 

這不是很奇怪嗎 ?
function 是programmer寫的
但是卻不是給 programmer 自己用的




對啊 
所以才叫做callback(回呼) function 

那是誰會呼叫呢 ?
多半是給系統 
或者是其他人的函式庫(也可能是 System library. )

那別人的 function
如何知道呼叫 programmer 所實做的 function 呢?

這個簡單
看宣告寫就可以拉

那邊會用到呢 ?
舉個例子吧

排序 !!


一般C++ 函式庫都有實做排序
要排一個陣列
如果是一個物件陣列

系統函式庫知道排序演算法
但是怎麼知道兩個物件怎麼比大小 ?

這個時候要 RD 實做一個比較物件大小的 function
把 function pointer 傳給演算法


請看下面 C++ 函式庫內建的快速排序宣告
1
2
3
4
5
6
7
void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*)); 

//////////////////////////
//其中
//////////////////////////
int (*compar)(const void*,const void*)); 

就是 programmer 要實做比較的演算法

實做


1
2
3
4
5
6
int compare (const void * a, const void * b)
{
  if ( *(I_am_Type*)a <  *(I_am_Type*)b ) return -1; // 左邊小, return -1
  if ( *(I_am_Type*)a == *(I_am_Type*)b ) return 0; // 相等 , return 0.
  if ( *(I_am_Type*)a >  *(I_am_Type*)b ) return 1; //右邊小 , return 1.
}


在比較大小的時候
qsort() 會呼叫 programmer 實做的 compare()
並且傳入 (void *)的值
讓 programmer 去決定誰大誰小

下面是程式範例
compare() 被當成參數傳入 qsort() 裡面
一旦 qsort 有要比較大小
則 callback 我們宣告的 compare()
qsort() 本身只負責排序演算法的部分囉
















沒有留言: