这实际上是一个非关键问题,但我在大多数情况下使用函数指针时都会收到此警告但仍无法自行解决原因。考虑以下原型:
typedef void * Pointer;
void tree_destroyLineage(Tree greatest_parent, void *dataDestructor(Pointer data));
到目前为止,我可以编译我的千行代码并获得零警告。所以我假设我正确地写了声明。但后来我在代码中调用它,作为我的析构函数传递自由,因为存储在树节点中的数据是简单的结构:
tree_destroyLineage(decision_tree, free);
这使我得到"warning: passing argument 2 of 'tree_destroyLineage' from incompatible pointer type"
消息。我的第一个假设是编译器在编译时无法弄清楚Pointer
和void *
是同一个东西,所以我尝试使用完全相同类型的函数指针创建另一个函数“重新调用“调用free()
并更改函数指针声明以接受void *
而不是指针。两种方法都在同一个地方给了我同样的警告。
我做错了什么,如何解决?
答案 0 :(得分:10)
我相信像free这样的函数的正确签名是:
void (*freefunc)(void*)
不
void *dataDestructor(Pointer data)
答案 1 :(得分:7)
我不确定你的图书馆,但我的免费没有回报价值(即,它是无效的)。它不会返回void指针。
如果你想让第二个参数成为一个返回void的函数的指针,并将一个void指针作为参数,我相信你想要的是:
void(* fn)(void *)
而不是
void * fn(void *)
这就是你所拥有的。
答案 2 :(得分:4)
void tree_destroyLineage(Tree greatest_parent,
void *dataDestructor(Pointer data));
应该是:
void tree_destroyLineage(Tree greatest_parent,
void (*dataDestructor)(Pointer data));
答案 3 :(得分:2)
试试这个:
void tree_destroyLineage(Tree greatest_parent, void (*dataDestructor)(void *data));
使用typedef
作为无效指针非常愚蠢。
编辑:问题是,如果没有*dataDestructor
左右的括号,编译器会认为函数返回void *
,而不是void
。括号告诉编译器函数返回void
,但它是指向函数的指针。