gpt4 book ai didi

c++ - 'void *' to ' void (*) (bool)' 使用 C++ 编译器在 C 中编译文件的指针错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:43 27 4
gpt4 key购买 nike

首先,感谢所有正在阅读的人以及您可以回复的人。

这部分代码,是界面库gui的一部分,完全用c语言编写。

但我很想用 c 编译这些编写的文件,使用 c++ 编译器能够集成到我正在使用 wxwidgets 的程序中。

在 c 文件中,我有几个函数调用,它们具有作为参数的指向其他函数的指针。

 typedef struct {
void (*fchd_ptr)(bool);
uint16_t xpos;
uint16_t ypos;
...
...
}BUTTON_t;

void BT_SetHandler(BUTTON_t* ptr, void* fchd_ptr)
{
if (ptr == NULL)
return;

ptr->fchd_ptr = fchd_ptr; // OK in C, ERROR In C++
}

当我尝试用 C++ 编译时,出现此错误。

ptr-> fkt_ptr = fkt_ptr;
// error: invalid conversion from 'void *' to 'void (*) (bool)' [-fpermissive]

如果我进行显式转换。

ptr-> fkt_ptr = (bool *) fkt_ptr;
// error: can not convert 'bool *' to 'void (*) (bool)' in assignment

欢迎任何帮助和解释如何解决。

最佳答案

您的显式转换是错误的。当您确实应该转换为 void (*)(bool) 时,您转换为 bool *(指向 bool 类型的对象的指针)(指向采用 bool 且不返回任何内容的函数的指针)。1

如果您将该行替换为

ptr->fchd_ptr = (void (*)(bool)) fchd_ptr;

它将在 C 和 C++ 中编译。


但是,如果可能,您应该尝试只用 C 语言编译您的 C 代码 - 虽然我们可能会让这件事起作用,但这两种语言并不总是完全兼容,您很可能会在路上遇到麻烦。通常,可以将 C 代码与 C++ 部分分开编译。如果你使用 extern "C"在头文件中,您可以简单地将 C++ 对象和 C 对象链接在一起,或者将 C 部分保存在单独的库(静态或动态)中。

此外,我建议重新设计 C API,以便在可能的情况下,它真正始终采用函数指针。通过 void * 别名是丑陋的,如果您传入错误的指针类型,可能会导致一些非常讨厌的错误和崩溃。


1 函数指针通常与对象指针有很大不同,是否允许您在两者之间转换是实现定义的。在这里,您需要一个指向函数的指针,而不是一个指向对象的指针(例如 bool* 将是一个指向 bool 类型对象的指针),这样您就可以调用稍后。您可以在代码示例中看到 void (*fchd_ptr)(bool) 是您分配给的变量的声明,这使得 void (*)(bool)它的类型。如果您发现符号有些困惑,cdecl.org是处理那些来自 C 的复杂数组、指针和函数指针名称的好方法。

关于c++ - 'void *' to ' void (*) (bool)' 使用 C++ 编译器在 C 中编译文件的指针错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50263615/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com