C++ 类型转化问题

2019-06-04 13:42:26 +08:00
 rain423

const uint8_t* 和 uint8_t* 如何互相转化??

3129 次点击
所在节点    程序员
22 条回复
MidLinn
2019-06-04 13:45:22 +08:00
const_cast ?
rain423
2019-06-04 13:48:03 +08:00
@MidLinn const_cast<uint8_t*> 这样吗?不行啊啊
MidLinn
2019-06-04 13:55:48 +08:00
@rain423 这个直接转原本就是 const 的变量也不行,你贴个代码看看。
fyyz
2019-06-04 14:00:06 +08:00
如果是 uint8_t 的指针或者引用就要用 const_cast,如果不是指针或者引用,拷贝赋值给新的变量就行了
rain423
2019-06-04 14:04:49 +08:00
函数声明 void onCallback(uint8_t* data, int len);
调用处 onCallback(const_cast<uint8_t*>(ov.userData),ov.userDataLen);
rain423
2019-06-04 14:05:32 +08:00
@MidLinn ov.userData 类型是 const uint8_t*
rain423
2019-06-04 14:06:59 +08:00
@MidLinn errorInfo:error: invalid conversion from 'const uint8_t* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
tairan2006
2019-06-04 14:18:01 +08:00
一般需要把 const 取消,都是设计有问题…
ysc3839
2019-06-04 14:18:48 +08:00
你应该去掉 const,而不是强制转换类型然后写入。
jorneyr
2019-06-04 14:18:53 +08:00
reinterpret_cast
v2byy
2019-06-04 14:20:40 +08:00
const_cast 是用来去 const,不是加 const 的
across
2019-06-04 14:20:41 +08:00
这个为啥会报错啊?
GCC 设置特殊参数了?
testeststs
2019-06-04 14:21:30 +08:00
const uint8_t* c_var;
uint8_t* var;

c_var = var;
var = const_cast<uint8_t*>(c_var);
sightchen
2019-06-04 14:22:22 +08:00
可以改函数声明吗? ov.userData 类型是 const uint8_t*常量指针,不希望通过指针来更改指向的内容,那把它传递给 onCallback 时,onCallback 的第一个参数设计为 const uint8_t*比较合理,这样在函数里面就不能通过指针修改指针指向的内容了,只能使用不能更改。
rain423
2019-06-04 14:26:35 +08:00
@sightchen 可以改,onCallback 的第一个参数改为 const uint8_t*,没问题。但是后面在 jni 层调用 java 层的 static 方法时出现问题了。。JNIEnv *env = getJNIEnv();
jbyte* buff = (jbyte*)data;
jbyteArray jarray = env->NewByteArray(len);
env->SetByteArrayRegion(jarray, 0, len, buff);
env->CallStaticIntMethod(mClass, fields.onCallbackListener, jarray);
rain423
2019-06-04 14:28:40 +08:00
@ysc3839 Android 开发,业务需求需要调用底层接口,所以不好改底层的代码
rain423
2019-06-04 14:31:41 +08:00
@jorneyr error: reinterpret_cast from type 'const uint8_t* {aka const unsigned char*}' to type 'uint8_t* {aka unsigned char*}' casts away qualifiers
ipwx
2019-06-04 14:35:10 +08:00
一般把 const * 改成 * 都会有你意想不到的隐患,比如对象内部状态不统一。因为类的设计者认为这个接口不会造成数据变更。

正确方法:联系你调用的类的作者,改代码。

不要说什么业务需要调用底层接口不好改代码,各种 BUG 都是这种思想造成的。
MidLinn
2019-06-04 14:45:07 +08:00
@rain423 那就复制一份就好了嘛

uint8_t tmpUserData = *(ov.userData);
onCallback(&tmpUserData,ov.userDataLen);
sightchen
2019-06-04 14:50:38 +08:00
@MidLinn
@rain423 不错哦,如果不更改只是使用,这样子操作也行嘛,还避免了 const uint8_t*转 uint8_t*的隐患。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/570726

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX