您的位置:首页 > 其它

【不算奇葩的问题】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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: