【不算奇葩的问题】MDK用c99的void*作为函数的形参使用出BUG
来源:互联网 发布:不溅水马桶 知乎 编辑:程序博客网 时间:2024/05/22 01:50
怎么说呢???
咱初学C/C++时候,都知道void*可以强转成任意类型,但是不能反过来转,即
void *p;
unsigned char *k,z;
k = (char*)p;//正确
p = (void*)k;//错误
我遇到的这个BUG是void*强转为unsigned char时,数据错误,在使用W5500官方库文件时,有类似的代码
z = *(unsigned char*)p;//数值错误
z = (unsigned char)p;//数值正确
原因:
我就是想说到底C99能不能void*强转为*(unsigned char*)呢,答案实测是不能滴,但是w5500官方库的代码却又有类似“z = *(unsigned char*)p;”这种代码,好坑爹!!!因为w5500官方库是GNU的gcc标准,gcc扩充了void*的使用,为定长类型,和char*相同,而ANSI是不支持void*为定长的类型(/ □ \),具体见gcc标准https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc.pdf的第403页 void的sizeof长度为1
解法一:
改库文件,全都把z = *(unsigned char*)p;改成z = (unsigned char)p;这种形式
解法二:
在调用类似ctlwizchip等函数时,不要直接把“宏”当作参数放进去,用一个uint8_t的数值传入指针即可
eg:
uint8_t tmp = IK_SOCK_1;
ctlwizchip(CW_SET_INTRMASK,(void*)&tmp);
所以,必须手动修改这部分代码!!浪费了2天时间,还以为我自己代码写错了呢Orz
- 【不算奇葩的问题】MDK用c99的void*作为函数的形参使用出BUG
- 【不算奇葩的问题】MDK调试stm32遇到BEAB BKPT 0xAB,重定向printf的BUG
- mdk 使用--C99标准的问题
- C99中变长数组作为函数形参的问题
- mdk安装遇到的各类奇葩问题
- 【不算奇葩的问题】stm32外部中断一直响应
- jspsmartupload 不算bug的bug
- void的两个奇葩用法
- void的两个奇葩用法
- 各种奇葩的BUG
- 一个MySQL的奇怪问题-----不知道算不算bug
- 这算不算csdn的bug还是浏览器问题?
- 一个奇葩bug的解决
- 一个比较奇葩的bug
- RecycleView遇到的奇葩bug
- STM32(MDK)中不能使用printf()函数的问题
- CMFCRibbonButton使用HICON作为参数的构造函数BUG
- MDK赋值出错的BUG
- 前端div的显示隐藏、Jquery input只读
- 网页中设置颜色值的几种方法
- mac Cornerstone SVN出错 Description : The working copy is locked due to a previous error
- 关于shell命令的定向输出 2>&1
- 关于WEB集群中文件服务器的讨论
- 【不算奇葩的问题】MDK用c99的void*作为函数的形参使用出BUG
- iOS上架流程概述
- LINKS
- 进击的KFC:在同一个Xib内创建多个UITableViewCell来方便使用
- 费用预算查询类
- MySQL复制应用中继日志解析
- leetcode 283. Move Zeroes
- 属性动画(二)
- 12个Linux进程管理命令介绍