C语言回调函数随笔
?
簡而言之,回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用為調(diào)用它所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。
?
因為可以把調(diào)用者與被調(diào)用者(實現(xiàn)者)分開,所以調(diào)用者不關(guān)心誰是被調(diào)用者。它只需知道存在一個具有特定原型和限制條件的被調(diào)用函數(shù)。換句話講,回調(diào)函數(shù)就是允許用戶把需要調(diào)用的方法的指針作為參數(shù)傳遞給一個函數(shù),以便該函數(shù)在處理相似事件的時候可以靈活的使用不同的方法。
?
一個簡單的回調(diào)函數(shù)實現(xiàn)
下面創(chuàng)建了一個sort.dll的動態(tài)鏈接庫,它導(dǎo)出了一個名為 CompareFunction的類型--typedef int (__stdcall *CompareFunction)(const byte*, const byte*),它就是回調(diào)函數(shù)的類型。另外,它也導(dǎo)出了兩個方法:Bubblesort()和Quicksort(),這兩個方法原型相同,但實現(xiàn)了不同 的排序算法。
| 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); |
這兩個函數(shù)接受以下參數(shù):
·byte * array:指向元素數(shù)組的指針(任意類型)。
·int size:數(shù)組中元素的個數(shù)。
·int elem_size:數(shù)組中一個元素的大小,以字節(jié)為單位。
·CompareFunction cmpFunc:帶有上述原型的指向回調(diào)函數(shù)的指針。
例如:
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);
}
如果想進行降序排序(大元素在先),就只需修改回調(diào)函數(shù)的代碼,或使用另一個回調(diào)函數(shù),這樣編程起來靈活性就比較大了。
轉(zhuǎn)載于:https://www.cnblogs.com/rengpiaomiao/p/4463861.html
總結(jié)
- 上一篇: 第8章 拦截器机制
- 下一篇: css sprite css雪碧图生成工