You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:57:00