C++14下如何实现结构体赋值,解决bluez开发gpointer转adapter*报错
问题解决方法
报错根本原因
C语言原生支持void*类型隐式转换为任意指针类型,所以BlueZ的纯C代码中直接赋值的写法是合法的。但C标准不允许void*的隐式类型转换,必须显式声明转换规则,这是g编译报错的核心原因。
你不需要做两个结构体的成员映射:GList是GLib提供的通用泛型链表结构,list->data字段本来就存储的是struct adapter*类型的地址,只是被泛型容器统一转为gpointer(即void*)类型存储而已。
可行解决方案
按推荐优先级排序如下:
- 方案1:使用C风格静态类型转换,符合C开发规范,无额外风险,仅需修改7处同类赋值语句,修改后代码如下:
struct adapter *adapter = static_cast<struct adapter*>(list->data);
所有同类赋值都按上述格式替换即可,无需改动其他业务逻辑。
- 方案2:临时验证场景下,可以在g++编译参数中添加
-fpermissive选项,将该错误降级为警告,直接通过编译,不推荐生产环境使用。 - 方案3:将涉及BlueZ原生C逻辑的代码单独抽为
.c文件编译,对外接口用extern "C"修饰,再和你的C++代码单元联合链接,改动量更大,适合不想修改上游BlueZ源码的场景。
内容的提问来源于stack exchange,提问作者Hillybilly
相关产品推荐
相关产品推荐

