2013-02-19 60 views
1

考慮下面的聲明用於更新雙向鏈表節點的功能:正確使用泛型函數指針

uint8 dl_update(DL_LIST **node, uint16 new_tag, void *new_object, 
    uint32 new_size, void (*destructor)(void*)) 

而下面的調用該函數:

dl_update(&dlt_list, _TAG, zulu, sizeof(*zulu), 
    (void(*)(void*)) &_free_dlt_object(delta)); 

最後一個參數是什麼會導致編譯器發出錯誤消息「左值作爲一元'&'運算符」?析構函數我傳遞(和它的操作結構)的定義如下:

typedef struct DLT_OBJECT { 
    char *word; 
    uint8 number; 
} DLT_OBJECT; 

void _free_dlt_object(DLT_OBJECT *object) { 
    free(object->word); 
    free(object); 
} 

以下question似乎暗示着它的好投一個函數指針,所以我不相信,我這樣做雖然考慮到我的代碼在裸​​機嵌入式系統上運行(在question中列出可能的疑難問題),但我不確定。

這是一個簡單的語法錯誤,還是更多的結構性問題?我一直在使用這樣的印象:使用void指針參數聲明函數指針是將泛型函數指針傳遞給其他函數的好方法...

回答

2

當使用函數指針時,您只是傳遞一個函數,所以你打電話像這樣

dl_update(&dlt_list, _TAG, zulu, sizeof(*zulu), _free_dlt_object); 
+0

我很困惑(再次)基思。你正在傳遞函數而不是指向函數的指針,而AFAIK它們不是同一件事。你怎麼能省略函數指針的參數?我無法協調您的答案與[本](http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work)中發佈的示例代碼... – RBE 2013-02-19 21:18:32

+1

@RBE函數指示符幾乎在所有上下文中隱式轉換爲函數指針。當你傳遞一個函數(-pointer)給函數時,你不能在那裏寫一個參數,因爲它是你傳遞的函數(指針),而不是函數調用的結果。 – 2013-02-19 21:24:24

+0

@DanielFischer這是否意味着'_free_dlt_object'函數參數需要分別傳遞給'dl_update'指向'_free_dlt_object'本身的指針?我明白你所說的將_pointer_傳遞給函數,但我不明白指向函數如何接收它的參數。 – RBE 2013-02-19 21:36:01