函數指針、callback、message queue三者關係在Java等程序員眼中屬於高深莫測的內容。諸多Android/java程序員常用handle,但是對於handle的實現原理估計諱莫如深。
函數指針
c語言的精髓之一的函數指針是c語言做複雜系統開發常用的方法。對此我不做過多廢話,希望能看懂
/* define a function point type */
typedef int (*FP_ADD)(int,int);
/* function body */
int
add(int a, int b)
{
return a + b;
}
int
main(){
/* give value to function pointer */
FP_ADD fp_add = add ;
(*fp_add)(1, 2);
}
好,相比看完sample能夠簡單明白函數指針是何用途了吧。
callback
callback即常說的回調函數。
考慮如下場景:
場景一
你作爲一個下載類的作者,提供一個函數接口給別人,用來執行一個異步(線程)的下載任務。下載完成,執行調用者傳遞進來的某一函數(回調函數)。此功能模塊即可用函數指針實現。
場景二
你作爲一個類的開發者,提供一個基類給別人,例如一個控件類。但是你又希望用戶能夠自己擴展他們自己的自定義需求,例如自定義重繪。是否也用函數指針呢?不好意思,繞遠了,這個是虛函數的典型應用場景。不是我討論的回調函數。
/* function body */
int
add(int a, int b)
{
return a + b;
}
/* provide by other developer */
void
download(const char* url,
cb callbk);
int
main(){
/* give value to function pointer */
download("xx.xxx.xxx/xx.zip", add);
}
/* other developer's code */
typedef int (*cb)(int,int);
void
download(const char * url
, cb callbk){
/* ...bla bla bla... */
(*callbk)(1, 2);
}
此爲callback函數的比較簡要的一個sample。
message queue
消息隊列常常在biger big project中用到,例如一個大型網遊、操作系統等類型項目出現。大致是函數指針,隊列兩者實現。
具體的sample請讀者自己揣摩。