C++ 类型转化问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
rain423
V2EX    程序员

C++ 类型转化问题

  •  
  •   rain423 2019 年 6 月 4 日 3695 次点击
    这是一个创建于 2505 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    uint8_t tmpUserData = *(ov.userData);
    onCallback(&tmpUserData,ov.userDataLen);
    sightchen
        20
    sightchen  
       2019 年 6 月 4 日
    @MidLinn
    @rain423 不错哦,如果不更改只是使用,这样子操作也行嘛,还避免了 const uint8_t*转 uint8_t*的隐患。
    GeminiPro
        21
    GeminiPro  
       2019 年 6 月 4 日
    如果强行转,reinterpret_cast 可以做到,但是这么转都是不合理的设计造成的,总有一天会爆发隐患。
    ysc3839
        22
    ysc3839  
       2019 年 6 月 4 日
    @MidLinn 这里有 userDataLen,那估计不是单个元素,而是一个数组吧?你这么“复制”结果可能就越界访问了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3060 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 15:11 PVG 23:11 LAX 08:11 JFK 11:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86