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

发布于 2024-12-07 06:48:17 字数 551 浏览 1 评论 0原文

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

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's原型,因为我可能会提供一些修改数据的函数。对于如何处理这种情况有什么建议吗?

I have a function that takes a function pointer and apply it over a list. It's prototype is as follows:

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

Now I want to supply a function that prints the element in the list. Since I'm not modifying the list element, the print function looks like this:

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

//Usage
applyList(list, printNode);

However I got an compiler error saying

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

I don't want to add const to apply's prototype, because I might supply some function that modifies the data. Any suggestion on how to deal with this situation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小镇女孩 2024-12-14 06:48:17

不幸的是,在 C 中函数指针不是多态的。完全没有。尝试强制转换会导致未定义的行为。

唯一符合标准的出路是编写一个包装函数:

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

但是请注意,您的 const 在这里有点无用:

Data *dPtr=(Data*)nodeData;

您刚刚抛弃了 const 声明。尝试将其保留在那里:

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

Unfortunately, in C function pointers are not polymorphic. At all. Attempting to force a cast leads to undefined behavior.

Your only standard-conforming way out is to write a wrapper function:

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

Note, however, that your const is kind of useless here:

Data *dPtr=(Data*)nodeData;

You just casted away the const declaration. Try to keep it on there:

const Data *dPtr=(const Data*)nodeData;
尾戒 2024-12-14 06:48:17

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

那么就没有明智的解决方案。您无法修改该数据,这就是它被标记为 const 的原因。

I don't want to add const to apply's prototype, because I might supply some function that modifies the data.

Then there is no sane solution. The data isn't yours to modify, which is why it's marked const.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文