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

标签 c constants function-pointers

我有一个函数,它接受函数指针并将其应用于列表。其原型(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/

相关文章:

C++ 语言一些可变的实例

c - 在c中,char类型的参数与const char参数类型不兼容

c - 解释以下 Turbo C 代码中如何以及为何使用指针

c - 按位比较

c++ - ENUM常量问题

c++ - 使用带闭包的 lambda 回调

delphi - 如何在兼容的方法指针之间进行转换?

检查将一个函数指针转换为另一个函数指针是否安全

客户端服务器延迟30分钟

c - R CMD SHLIB 编译 C 代码时出错