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指針參數聲明函數指針是將泛型函數指針傳遞給其他函數的好方法...
我很困惑(再次)基思。你正在傳遞函數而不是指向函數的指針,而AFAIK它們不是同一件事。你怎麼能省略函數指針的參數?我無法協調您的答案與[本](http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work)中發佈的示例代碼... – RBE 2013-02-19 21:18:32
@RBE函數指示符幾乎在所有上下文中隱式轉換爲函數指針。當你傳遞一個函數(-pointer)給函數時,你不能在那裏寫一個參數,因爲它是你傳遞的函數(指針),而不是函數調用的結果。 – 2013-02-19 21:24:24
@DanielFischer這是否意味着'_free_dlt_object'函數參數需要分別傳遞給'dl_update'指向'_free_dlt_object'本身的指針?我明白你所說的將_pointer_傳遞給函數,但我不明白指向函數如何接收它的參數。 – RBE 2013-02-19 21:36:01