2013-02-19 61 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