【不算奇葩的问题】MDK用c99的void*作为函数的形参使用出BUG

来源:互联网 发布:不溅水马桶 知乎 编辑:程序博客网 时间:2024/05/22 01:50

这是偶然使用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

0 0
原创粉丝点击