我有一个函数,它接受一个函数指针并将其应用于列表。它的原型如下:
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
的原型中,因为我可能会提供一些修改数据的函数。关于如何处理这种情况的任何建议?
答案 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);