搜索
bottom↓
回复: 11
打印 上一主题 下一主题

c++环境编译easyFlash,出现类型不同不可以赋值的提示,求解

[复制链接]

出425入0汤圆

跳转到指定楼层
1
发表于 2016-1-13 16:38:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 guolun 于 2016-1-13 16:44 编辑

我在项目中加入easyFlash,编译时出现“Error[Pe513]: a value of type "void const *" cannot be assigned to an entity of type "uint8_t const *

出现错误的程序:uint32_t ef_calc_crc32(uint32_t crc, const void *buf, size_t size)
{
    const uint8_t *p;

    p = buf;
    crc = crc ^ ~0U;

    while (size--) {
        crc = crc32_table[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
    }

    return crc ^ ~0U;
}


我理解的意思是:buf  是void const* 类型,p 是const uint8_t* 类型,p = buf 操作不允许。
疑问1:常量指针buf为什么不定义为uint8_t类型?
疑问2:如果改 buf  为 uint8_t 类型,程序有什么影响?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

2
发表于 2016-1-13 16:53:24 | 只看该作者
用const uint8_t*强制定义一下buf,试试。
呵呵。

出0入0汤圆

3
发表于 2016-1-13 17:05:59 | 只看该作者
通用性啊, 任何形式的指针 可以 转换为void *指针 而不需要强制声明。

出0入0汤圆

4
发表于 2016-1-13 17:10:15 | 只看该作者
这样写是为了通用性 使用的时候要强制转换
如果改了就不会报错了

出425入0汤圆

5
 楼主| 发表于 2016-1-13 18:06:10 | 只看该作者
本帖最后由 guolun 于 2016-1-13 18:07 编辑

C编译器也许可以允许void指针 p++ 这样操作,但C++编译器会报错,提示void指针不可以这样操作。
我现在工程文件很多c++元素,不能更改为C了。怎么让上面的函数通过C++的编译?

出0入0汤圆

6
发表于 2016-1-13 19:16:22 | 只看该作者
guolun 发表于 2016-1-13 18:06
C编译器也许可以允许void指针 p++ 这样操作,但C++编译器会报错,提示void指针不可以这样操作。
我现在工程 ...

p = (const uint8_t *)buf;

出425入0汤圆

7
 楼主| 发表于 2016-1-14 08:42:06 | 只看该作者
楼上的方法可以通过编译。
不过,如果buf的实参不是8位,而是16位,程序运行会不会出错?

出0入93汤圆

8
发表于 2016-1-14 09:12:42 | 只看该作者
guolun 发表于 2016-1-13 18:06
C编译器也许可以允许void指针 p++ 这样操作,但C++编译器会报错,提示void指针不可以这样操作。
我现在工程 ...

简单粗暴的解决方案,当然是直接强制转换。

偷懒的治本方案:
前提:C++和C是完全不同的两种语言,而且互不兼容(大部分兼容),尤其新出的各种标准分道扬镳的现象越来越严重;说完全兼容的都是半吊子或者别有用心的。
内部命名方案:C可能在变量或函数前面加下划线,也可能不加,取决于编译器;C++则会在函数前后加修饰以区分函数重载及成员方法,这个是规定,但是可以通过extern "C"限定为C的命名。
解决方案:原来是C还保留为C文件,是C++的还保留为C++文件。交叉调用时,在C++中通过extern "C"进行修饰,一般在头文件中使用。

H文件代码,C/C++通用:
  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif

  4. // 可以交叉调用的变量和函数声明

  5. #ifdef __cplusplus
  6. };
  7. #endif
复制代码

出0入198汤圆

9
发表于 2016-1-14 20:26:42 | 只看该作者
一直没在C++环境上测试过。

6L 的方法肯定可以的。你不用担心入参类型宽度。

出0入0汤圆

10
发表于 2016-1-14 20:33:43 | 只看该作者
学过一点点C++的路过

出0入4汤圆

11
发表于 2016-1-14 21:02:06 | 只看该作者
见过很多C文件,基本上都是加上8楼说的那样的

出425入0汤圆

12
 楼主| 发表于 2016-1-15 08:44:11 | 只看该作者
目前用6L的强制转换的方法。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 04:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表