【不算奇葩的问题】MDK用c99的void*作为函数的形参使用出BUG
2016-04-29 14:02
246 查看
这是偶然使用MDK的C99模式发现的BUG,不过也不能算BUG!!
怎么说呢???
咱初学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
怎么说呢???
咱初学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
相关文章推荐
- mysql外键创建失败的问题
- ZooKeeper系列之五:ZooKeeper的运行
- 查看及修改Oracle编码格式方法
- 车牌号对应归属地及城市JSON带简码
- Android Studio 导出APK
- MyEclipse2015 stable 2.0 for mac破解(系统版本为Mac OS X 10.10.1 Yosemite)
- JavaEE开发中Hibernate使用小技巧总结(持续更新)
- eclipse 下查看jdk 源码
- jqGrid应用--销售管理
- C实现矩阵加减乘除运算
- IKAnalyzer中文分词
- Java并发编程:Thread类的使用
- CSS-标准盒模型 & 怪异盒模型
- ArrayList LinkedList 的区别 以及使用场合
- org.hibernate.hql.ast.QuerySyntaxException: is not mapped 异常总结
- ZooKeeper系列之四:ZooKeeper的配置
- 从小蝌蚪找妈妈谈“机器学习VS数据挖掘”
- SQL Server Profiler工具
- PHP多进程编程(一)
- UML的9种图例解析