C++ const结构体指针成员传参时类型转换与数组初始化错误如何解决
错误原因分析
- 第一个
invalid conversion from ‘const char*’ to ‘char*’错误:
该错误的根因和你的判断一致,pMsg是const ZTEST*类型指针,其所有成员都自带const属性,成员y的实际类型为const char[50],作为参数传递时会隐式转为const char*。而zDataPro的第二个形参ZEGBEE_MAC_ID作为函数参数时会退化为char*,C++不允许隐式丢弃const属性,因此报错。 - 第二个
array must be initialized with a brace-enclosed initializer错误:ZEGBEE_MAC_ID本质是数组类型char[50],C/C++不允许直接用另一个数组来初始化数组变量,你写的ZEGBEE_MAC_ID pData = pMsg->y相当于尝试用指针给数组做初始化,不符合语法要求。
正确解决方法
可根据实际场景二选一:
场景1:确认zDataPro不会修改传入的第二个参数内容
直接用const_cast去掉const属性即可,这是性能开销最小的方案:
void zExtractData(const ZTEST* pMsg) { zDataPro(pMsg->x, const_cast<ZEGBEE_MAC_ID>(pMsg->y)); }
场景2:不确定zDataPro是否会修改参数,避免改写原const对象的内容
先创建临时数组,将原字符串拷贝到临时数组后再传入:
#include <cstring> void zExtractData(const ZTEST* pMsg) { ZEGBEE_MAC_ID pData; // 用strncpy更安全,避免原字符串过长导致数组越界 strncpy(pData, pMsg->y, sizeof(pData) - 1); pData[sizeof(pData) - 1] = '\0'; // 手动补字符串结束符,避免strncpy未自动填充的边界问题 zDataPro(pMsg->x, pData); }
内容的提问来源于stack exchange,提问作者user2520119
相关产品推荐
相关产品推荐

