const uint8_t* 和 uint8_t* 如何互相转化??
1
MidLinn 2019-06-04 13:45:22 +08:00
const_cast ?
|
4
fyyz 2019-06-04 14:00:06 +08:00
如果是 uint8_t 的指针或者引用就要用 const_cast,如果不是指针或者引用,拷贝赋值给新的变量就行了
|
5
rain423 OP 函数声明 void onCallback(uint8_t* data, int len);
调用处 onCallback(const_cast<uint8_t*>(ov.userData),ov.userDataLen); |
7
rain423 OP @MidLinn errorInfo:error: invalid conversion from 'const uint8_t* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
|
8
tairan2006 2019-06-04 14:18:01 +08:00
一般需要把 const 取消,都是设计有问题…
|
9
ysc3839 2019-06-04 14:18:48 +08:00 via Android
你应该去掉 const,而不是强制转换类型然后写入。
|
10
jorneyr 2019-06-04 14:18:53 +08:00
reinterpret_cast
|
11
v2byy 2019-06-04 14:20:40 +08:00
const_cast 是用来去 const,不是加 const 的
|
12
across 2019-06-04 14:20:41 +08:00
这个为啥会报错啊?
GCC 设置特殊参数了? |
13
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); |
14
sightchen 2019-06-04 14:22:22 +08:00
可以改函数声明吗? ov.userData 类型是 const uint8_t*常量指针,不希望通过指针来更改指向的内容,那把它传递给 onCallback 时,onCallback 的第一个参数设计为 const uint8_t*比较合理,这样在函数里面就不能通过指针修改指针指向的内容了,只能使用不能更改。
|
15
rain423 OP @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); |
17
rain423 OP @jorneyr error: reinterpret_cast from type 'const uint8_t* {aka const unsigned char*}' to type 'uint8_t* {aka unsigned char*}' casts away qualifiers
|
18
ipwx 2019-06-04 14:35:10 +08:00 1
一般把 const * 改成 * 都会有你意想不到的隐患,比如对象内部状态不统一。因为类的设计者认为这个接口不会造成数据变更。
正确方法:联系你调用的类的作者,改代码。 不要说什么业务需要调用底层接口不好改代码,各种 BUG 都是这种思想造成的。 |
19
MidLinn 2019-06-04 14:45:07 +08:00 1
|
20
sightchen 2019-06-04 14:50:38 +08:00
|
21
tyrantZhao 2019-06-04 14:58:52 +08:00
如果强行转,reinterpret_cast 可以做到,但是这么转都是不合理的设计造成的,总有一天会爆发隐患。
|