2

这实际上是一个非关键问题,但我在大多数情况下使用函数指针时都会收到此警告,但我自己仍然无法弄清楚为什么。考虑以下原型:

typedef void * Pointer;
void tree_destroyLineage(Tree greatest_parent, void *dataDestructor(Pointer data));

到目前为止,我可以编译我的千行代码并获得零警告。所以我假设我正确地编写了声明。但后来我在代码中调用它,将 free 作为我的析构函数传递,因为存储在树节点中的数据是简单的结构:

tree_destroyLineage(decision_tree, free);

这让我得到了一个"warning: passing argument 2 of 'tree_destroyLineage' from incompatible pointer type"信息。我的第一个假设是编译器在编译时无法弄清楚这是同一件事Pointervoid *所以我尝试使用完全相同类型的函数指针创建另一个函数,以“重新传递”调用free()并更改函数指针声明接受 avoid *而不是指针。这两种方法在同一个地方给了我同样的警告。

我做错了什么,我该如何解决?

4

4 回答 4

10

我相信像免费这样的功能的正确签名是:

void (*freefunc)(void*)

不是

void *dataDestructor(Pointer data)
于 2009-05-08T19:12:29.043 回答
7

我不确定你的图书馆,但我的免费没有返回值(即它是无效的)。它不返回 void 指针。

如果您希望第二个参数是指向返回 void 并将 void 指针作为参数的函数的指针,我相信您想要的是:

无效 (*fn)(无效*)

并不是

无效*fn(无效*)

这就是你所拥有的。

于 2009-05-08T19:14:13.953 回答
4
void tree_destroyLineage(Tree greatest_parent, 
                          void *dataDestructor(Pointer data));

应该:

void tree_destroyLineage(Tree greatest_parent, 
                          void (*dataDestructor)(Pointer data));
于 2009-05-08T19:15:58.533 回答
2

试试这个:

void tree_destroyLineage(Tree greatest_parent, void (*dataDestructor)(void *data));

将 atypedef用于 void 指针简直是愚蠢的。

编辑:问题是,如果没有括号*dataDestructor,编译器认为函数返回void *,而不是void. 括号告诉编译器该函数返回void,但它是一个指向函数的指针。

于 2009-05-08T19:12:04.253 回答