函數指針、callback、message queue

函數指針、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請讀者自己揣摩。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章