• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rain423
V2EX  ›  程序员

C++ 类型转化问题

  •  
  •   rain423 · Jun 4, 2019 · 3821 views
    This topic created in 2561 days ago, the information mentioned may be changed or developed.

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

    22 replies    2019-06-04 19:24:35 +08:00
    MidLinn
        1
    MidLinn  
    PRO
       Jun 4, 2019
    const_cast ?
    rain423
        2
    rain423  
    OP
       Jun 4, 2019
    @MidLinn const_cast<uint8_t*> 这样吗?不行啊啊
    MidLinn
        3
    MidLinn  
    PRO
       Jun 4, 2019
    @rain423 这个直接转原本就是 const 的变量也不行,你贴个代码看看。
    fyyz
        4
    fyyz  
       Jun 4, 2019
    如果是 uint8_t 的指针或者引用就要用 const_cast,如果不是指针或者引用,拷贝赋值给新的变量就行了
    rain423
        5
    rain423  
    OP
       Jun 4, 2019
    函数声明 void onCallback(uint8_t* data, int len);
    调用处 onCallback(const_cast<uint8_t*>(ov.userData),ov.userDataLen);
    rain423
        6
    rain423  
    OP
       Jun 4, 2019
    @MidLinn ov.userData 类型是 const uint8_t*
    rain423
        7
    rain423  
    OP
       Jun 4, 2019
    @MidLinn errorInfo:error: invalid conversion from 'const uint8_t* {aka const unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
    tairan2006
        8
    tairan2006  
       Jun 4, 2019
    一般需要把 const 取消,都是设计有问题…
    ysc3839
        9
    ysc3839  
       Jun 4, 2019 via Android
    你应该去掉 const,而不是强制转换类型然后写入。
    jorneyr
        10
    jorneyr  
       Jun 4, 2019
    reinterpret_cast
    v2byy
        11
    v2byy  
       Jun 4, 2019
    const_cast 是用来去 const,不是加 const 的
    across
        12
    across  
       Jun 4, 2019
    这个为啥会报错啊?
    GCC 设置特殊参数了?
    testeststs
        13
    testeststs  
       Jun 4, 2019
    const uint8_t* c_var;
    uint8_t* var;

    c_var = var;
    var = const_cast<uint8_t*>(c_var);
    sightchen
        14
    sightchen  
       Jun 4, 2019
    可以改函数声明吗? ov.userData 类型是 const uint8_t*常量指针,不希望通过指针来更改指向的内容,那把它传递给 onCallback 时,onCallback 的第一个参数设计为 const uint8_t*比较合理,这样在函数里面就不能通过指针修改指针指向的内容了,只能使用不能更改。
    rain423
        15
    rain423  
    OP
       Jun 4, 2019
    @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
       Jun 4, 2019
    @ysc3839 Android 开发,业务需求需要调用底层接口,所以不好改底层的代码
    rain423
        17
    rain423  
    OP
       Jun 4, 2019
    @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  
       Jun 4, 2019   ❤️ 1
    一般把 const * 改成 * 都会有你意想不到的隐患,比如对象内部状态不统一。因为类的设计者认为这个接口不会造成数据变更。

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

    不要说什么业务需要调用底层接口不好改代码,各种 BUG 都是这种思想造成的。
    MidLinn
        19
    MidLinn  
    PRO
       Jun 4, 2019   ❤️ 1
    @rain423 那就复制一份就好了嘛

    uint8_t tmpUserData = *(ov.userData);
    onCallback(&tmpUserData,ov.userDataLen);
    sightchen
        20
    sightchen  
       Jun 4, 2019
    @MidLinn
    @rain423 不错哦,如果不更改只是使用,这样子操作也行嘛,还避免了 const uint8_t*转 uint8_t*的隐患。
    GeminiPro
        21
    GeminiPro  
       Jun 4, 2019
    如果强行转,reinterpret_cast 可以做到,但是这么转都是不合理的设计造成的,总有一天会爆发隐患。
    ysc3839
        22
    ysc3839  
       Jun 4, 2019
    @MidLinn 这里有 userDataLen,那估计不是单个元素,而是一个数组吧?你这么“复制”结果可能就越界访问了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4353 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 00:08 · PVG 08:08 · LAX 17:08 · JFK 20:08
    ♥ Do have faith in what you're doing.