C ++构建警告:解除引用类型惩罚指针将破坏严格别名规则

时间:2014-12-24 09:25:33

标签: c++ pointers casting

我的演员代码上有这个警告:

  

取消引用类型惩罚指针将破坏严格别名规则[-Wstrict-aliasing]

unsigned char buffer[64];
...
unsigned int value = *(unsigned int*)buffer;

如何修复此警告?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

此代码的作用取决于平台的字节顺序,对齐规则,整数大小等。通过观察它无法知道它的作用。但你可能想要这样的东西:

unsigned int value = buffer[0];
value = (value << 8) | buffer[1];
value = (value << 8) | buffer[2];
value = (value << 8) | buffer[3];

答案 1 :(得分:2)

如何解决此警告?

首先不要使用type-punning。在此示例中,您可以改用memcpy()

unsigned char buffer[64];
...
unsigned int value;
memcpy(&value, buffer, sizeof(value));

如果出现字节序问题,则可以在之后交换value的字节。或者,您可以使用移位解决方案,例如@DavidSchwartz's answer节目。