如何在C++中将void*转换为void**?nRF52833项目编译报错求助
解决C++编译Nordic NUS库时的void*类型不兼容错误
错误原因
C的类型安全检查比C严格,你的代码中&p_client是ble_nus_client_context_t**类型,原代码用C风格强制转换(void *)将其转为void*,但blcm_link_ctx_get的第三个参数需要void**类型,二者在C中属于不兼容的指针类型,因此触发编译错误。
解决方法
使用reinterpret_cast完成类型转换——这是C++中用于不同指针类型之间强制转换的正确方式,static_cast无法处理这种跨层级的不相关指针类型转换。
修改后的代码如下:
ble_nus_client_context_t * p_client = NULL; err_code = blcm_link_ctx_get(p_nus->p_link_ctx_storage, p_ble_evt->evt.gap_evt.conn_handle, reinterpret_cast<void**>(&p_client));
批量处理
项目中另外3处相同错误,都可以用同样的方式替换原有的(void*)转换,统一改为reinterpret_cast<void**>(目标指针的地址)即可。
替代方案(可选)
如果不想修改Nordic官方库文件ble_nus.c,可以在构建脚本(CMake/Makefile)中单独指定该文件用C编译器(如gcc)编译,绕过C的严格类型检查。但如果必须用C编译整个项目,上述类型转换是最直接的解决方式。
内容的提问来源于stack exchange,提问作者Jaekwon.Kim
相关产品推荐
相关产品推荐

