標籤:
簡而言之,回呼函數就是一個通過函數指標調用的函數。如果你把函數的指標(地址)作為參數傳遞給另一個函數,當這個指標被用為調用它所指向的函數時,我們就說這是回呼函數。
因為可以把調用者與被調用者(實現者)分開,所以調用者不關心誰是被調用者。它只需知道存在一個具有特定原型和限制條件的被調用函數。換句話講,回呼函數就是允許使用者把需要調用的方法的指標作為參數傳遞給一個函數,以便該函數在處理相似事件的時候可以靈活的使用不同的方法。
一個簡單的回呼函數實現
下面建立了一個sort.dll的動態連結程式庫,它匯出了一個名為 CompareFunction的類型--typedef int (__stdcall *CompareFunction)(const byte*, const byte*),它就是回呼函數的類型。另外,它也匯出了兩個方法:Bubblesort()和Quicksort(),這兩個方法原型相同,但實現了不同 的排序演算法。
void DLLDIR __stdcall Bubblesort(byte* array,int size,int elem_size,CompareFunction cmpFunc);
void DLLDIR __stdcall Quicksort(byte* array,int size,int elem_size,CompareFunction cmpFunc); |
這兩個函數接受以下參數:
·byte * array:指向元素數組的指標(任意類型)。
·int size:數組中元素的個數。
·int elem_size:數組中一個元素的大小,以位元組為單位。
·CompareFunction cmpFunc:帶有上述原型的指向回呼函數的指標。
例如:
int __stdcall CompareInts(const byte* velem1, const byte* velem2)
{
int elem1 = *(int*)velem1;
int elem2 = *(int*)velem2;
if(elem1 < elem2)
return -1;
if(elem1 > elem2)
return 1;
return 0;
}
int __stdcall CompareStrings(const byte* velem1, const byte* velem2)
{
const char* elem1 = (char*)velem1;
const char* elem2 = (char*)velem2;
return strcmp(elem1, elem2);
}
如果想進行降序排序(大元素在先),就只需修改回呼函數的代碼,或使用另一個回呼函數,這樣編程起來靈活性就比較大了。
C語言回呼函數隨筆