在C中将func(const void *)赋给func(void *)

时间:2011-09-29 18:40:59

标签: c const function-pointers

我有一个函数,它接受一个函数指针并将其应用于列表。它的原型如下:

void applyList(List *, void applyFunc(void *));

现在我想提供一个在列表中打印元素的函数。由于我没有修改list元素,因此print函数如下所示:

void printNode(const void *nodeData){
    Data *dPtr=(Data*)nodeData;
    printf("%s", dPtr->str );
}

//Usage
applyList(list, printNode);

但是我收到编译错误

expected ‘void (*)(void *)’ but argument is of type ‘void (*)(const void *)’

我不想将const添加到apply的原型中,因为我可能会提供一些修改数据的函数。关于如何处理这种情况的任何建议?

3 个答案:

答案 0 :(得分:3)

不幸的是,在C函数中,指针不是多态的。完全没有。试图逼迫演员会导致未定义的行为。

唯一符合标准的方法是编写包装函数:

static void wrap_printNode(void *nodeData) {
  printNode(nodeData);
}

但请注意,你的const在这里没用:

Data *dPtr=(Data*)nodeData;

你刚刚输出了const声明。试着把它放在那里:

const Data *dPtr=(const Data*)nodeData;

答案 1 :(得分:0)

  

我不想将const添加到apply的原型中,因为我可能会提供一些修改数据的函数。

然后没有理智的解决方案。这些数据不是您要修改的,这就是为什么它被标记为const

答案 2 :(得分:0)

试试这个

applyList(list, (void(*)(void*)) printNode);