V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rain423
V2EX  ›  程序员

C++ 类型转化问题

  •  
  •   rain423 · 2019-06-04 13:42:26 +08:00 · 3214 次点击
    这是一个创建于 1992 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    22 条回复    2019-06-04 19:24:35 +08:00
    MidLinn
        1
    MidLinn  
       2019-06-04 13:45:22 +08:00
    const_cast ?
    rain423
        2
    rain423  
    OP
       2019-06-04 13:48:03 +08:00
    @MidLinn const_cast<uint8_t*> 这样吗?不行啊啊
    MidLinn
        3
    MidLinn  
       2019-06-04 13:55:48 +08:00
    @rain423 这个直接转原本就是 const 的变量也不行,你贴个代码看看。
    fyyz
        4
    fyyz  
       2019-06-04 14:00:06 +08:00
    如果是 uint8_t 的指针或者引用就要用 const_cast,如果不是指针或者引用,拷贝赋值给新的变量就行了
    rain423
        5
    rain423  
    OP
       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
        6
    rain423  
    OP
       2019-06-04 14:05:32 +08:00
    @MidLinn ov.userData 类型是 const uint8_t*
    rain423
        7
    rain423  
    OP
       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
        8
    tairan2006  
       2019-06-04 14:18:01 +08:00
    一般需要把 const 取消,都是设计有问题…
    ysc3839
        9
    ysc3839  
       2019-06-04 14:18:48 +08:00 via Android
    你应该去掉 const,而不是强制转换类型然后写入。
    jorneyr
        10
    jorneyr  
       2019-06-04 14:18:53 +08:00
    reinterpret_cast
    v2byy
        11
    v2byy  
       2019-06-04 14:20:40 +08:00
    const_cast 是用来去 const,不是加 const 的
    across
        12
    across  
       2019-06-04 14:20:41 +08:00
    这个为啥会报错啊?
    GCC 设置特殊参数了?
    testeststs
        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);
    sightchen
        14
    sightchen  
       2019-06-04 14:22:22 +08:00
    可以改函数声明吗? ov.userData 类型是 const uint8_t*常量指针,不希望通过指针来更改指向的内容,那把它传递给 onCallback 时,onCallback 的第一个参数设计为 const uint8_t*比较合理,这样在函数里面就不能通过指针修改指针指向的内容了,只能使用不能更改。
    rain423
        15
    rain423  
    OP
       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
        16
    rain423  
    OP
       2019-06-04 14:28:40 +08:00
    @ysc3839 Android 开发,业务需求需要调用底层接口,所以不好改底层的代码
    rain423
        17
    rain423  
    OP
       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
        18
    ipwx  
       2019-06-04 14:35:10 +08:00   ❤️ 1
    一般把 const * 改成 * 都会有你意想不到的隐患,比如对象内部状态不统一。因为类的设计者认为这个接口不会造成数据变更。

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

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

    uint8_t tmpUserData = *(ov.userData);
    onCallback(&tmpUserData,ov.userDataLen);
    sightchen
        20
    sightchen  
       2019-06-04 14:50:38 +08:00
    @MidLinn
    @rain423 不错哦,如果不更改只是使用,这样子操作也行嘛,还避免了 const uint8_t*转 uint8_t*的隐患。
    tyrantZhao
        21
    tyrantZhao  
       2019-06-04 14:58:52 +08:00
    如果强行转,reinterpret_cast 可以做到,但是这么转都是不合理的设计造成的,总有一天会爆发隐患。
    ysc3839
        22
    ysc3839  
       2019-06-04 19:24:35 +08:00
    @MidLinn 这里有 userDataLen,那估计不是单个元素,而是一个数组吧?你这么“复制”结果可能就越界访问了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2509 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:04 · PVG 00:04 · LAX 08:04 · JFK 11:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.