C 正确使用泛型函数指针

C 正确使用泛型函数指针,c,function-pointers,C,Function Pointers,给定用于更新双链接列表中节点的函数的以下声明: 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(del

给定用于更新双链接列表中节点的函数的以下声明:

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));
最后一个参数会导致编译器发出错误消息“LevalueRequiredasunary'&'运算符”?我正在传递的析构函数(及其操作的结构)定义如下:

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

void _free_dlt_object(DLT_OBJECT *object) {
    free(object->word);
    free(object);
}
下面似乎暗示可以强制转换函数指针,因此我不认为这样做会导致问题,尽管考虑到我的代码运行在裸机嵌入式系统上(在中列出了可能的问题),我不确定


这是一个简单的语法错误,还是更多的结构问题?我一直在这样的印象下操作:使用void指针参数声明函数指针是将通用函数指针传递给其他函数的一种好方法…

当使用函数指针时,您只是传递一个函数,所以您可以这样进行调用

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

我(又)把基思弄糊涂了。您传递的是函数,而不是指向函数的指针,看来它们不是一回事。你怎么能省略函数指针的参数呢?我无法将您的答案与post中给出的示例代码相一致…@RBE函数指示符在几乎所有上下文中都隐式转换为函数指针。当你把一个函数(-pointer)传递给一个函数时,你不能在那里写一个参数,因为它是你传递的函数(pointer),而不是函数调用的结果。@RBE在
dl\u update
中调用
\u free\u dlt\u对象的参数将由
dl\u update
提供。这就是传递函数的目的,这样接收方就可以用它需要传递的任何参数调用它们。@RBE在这种情况下,函数dl_update基本上是说,嘿,作为更新的一部分,我将不得不删除一些对象,但我不知道需要做些什么来释放它们,所以,给我一个我想删除对象时可以调用的函数。@RBE:函数指示符和函数指针的语法问题有点奇怪,但是
\u free\u dlt\u object
&\u free\u dlt\u object
*\u free\u dlt\u object
甚至
******\u free\u dlt\u object
的计算结果都是一样的。