我有一个函数,它接受函数指针并将其应用于列表。其原型(prototype)如下:
void applyList(List *, void applyFunc(void *));
现在我想提供一个打印列表中元素的函数。由于我没有修改列表元素,因此打印函数如下所示:
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
的原型(prototype)中,因为我可能会提供一些修改数据的函数。对于如何处理这种情况有什么建议吗?
最佳答案
不幸的是,C 函数指针不是多态的。完全没有。尝试强制转换会导致未定义的行为。
唯一符合标准的出路是编写一个包装函数:
static void wrap_printNode(void *nodeData) {
printNode(nodeData);
}
但是请注意,您的 const 在这里有点无用:
Data *dPtr=(Data*)nodeData;
您刚刚抛弃了 const 声明。尝试将其保留在那里:
const Data *dPtr=(const Data*)nodeData;
关于c - 在 C 中将 func(const void *) 赋值给 func(void *),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7601884/