代码之家  ›  专栏  ›  技术社区  ›  Rafael Almeida Andre Goncalves

在C中使用函数指针时发出警告

  •  2
  • Rafael Almeida Andre Goncalves  · 技术社区  · 16 年前

    这实际上是一个非关键性的问题,但我在使用函数指针的大多数时间都会收到这个警告,但仍然无法自己找出原因。考虑以下原型:

    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() 并将函数指针声明更改为接受 空洞* 而不是指针。两种方法在同一个地方给了我同样的警告。

    我做错了什么,怎么解决?

    4 回复  |  直到 12 年前
        1
  •  10
  •   Unknown    16 年前

    我相信自由函数的正确签名是:

    void (*freefunc)(void*)
    

    void *dataDestructor(Pointer data)
    
        2
  •  7
  •   JF.    16 年前

    我不确定你的图书馆,但我的免费没有回报价值(也就是说,它是空的)。它不会返回空指针。

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

    无效(*fn)(无效*)

    而不是

    空格* fn(空格*)

    这就是你所拥有的。

        3
  •  4
  •   anon    16 年前
    void tree_destroyLineage(Tree greatest_parent, 
                              void *dataDestructor(Pointer data));
    

    应该是:

    void tree_destroyLineage(Tree greatest_parent, 
                              void (*dataDestructor)(Pointer data));
    
        4
  •  2
  •   Zifre    16 年前

    试试这个:

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

    使用A typedef 因为空虚的指针是很愚蠢的。

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

    推荐文章