C++ 构建警告:取消引用类型双关指针将破坏严格别名规则
Posted
技术标签:
【中文标题】C++ 构建警告:取消引用类型双关指针将破坏严格别名规则【英文标题】:C++ build warning : dereferencing type-punned pointer will break strict-aliasing rules 【发布时间】:2014-12-24 09:25:33 【问题描述】:我的演员阵容代码上有这个警告:
取消引用类型双关指针会破坏严格别名规则 [-Wstrict-aliasing]
unsigned char buffer[64];
...
unsigned int value = *(unsigned int*)buffer;
如何解决这个警告?
感谢您的帮助!
【问题讨论】:
你明白警告告诉你什么吗?您需要先了解问题,然后才能真正解决它。有很多方法可以在解决真正问题的情况下使警告静音,而仅仅让警告静音是完全没有意义的。 重复是一道 C 题,这是一道 C++ 题。这很重要,因为对“重复”的建议修复之一是使用在 C++ 中不起作用的union
。
@MattMcNabb 好点。事实上,没有一个答案可以作为这里的答案。出于这个原因,我重新打开了这个。
啊,是的,类型双关语。不是语言也不是 gcc 最好的时刻。 Here's 一篇出色的文章,涵盖了所有的如果,但可能与您正在尝试做的事情相关联。祝你好运!
不知道代码应该做什么,很难帮助你。代码的行为将是特定于平台的,在不了解您的平台的情况下,我们无法知道它应该做什么。有办法做它正在做的任何事情,但我们不知道那是什么。
【参考方案1】:
此代码的作用取决于平台的字节顺序、对齐规则、整数大小和其他因素。仅仅通过观察是无法知道它在做什么的。但你可能想要这样的东西:
unsigned int value = buffer[0];
value = (value << 8) | buffer[1];
value = (value << 8) | buffer[2];
value = (value << 8) | buffer[3];
【讨论】:
【参考方案2】:如何解决这个警告?
首先不要使用type-punning。在本例中,您可以改用memcpy()
;
unsigned char buffer[64];
...
unsigned int value;
memcpy(&value, buffer, sizeof(value));
如果字节序有问题,您可以在之后交换value
的字节。或者,您可以使用位移解决方案,例如 @DavidSchwartz's answer 节目。
【讨论】:
以上是关于C++ 构建警告:取消引用类型双关指针将破坏严格别名规则的主要内容,如果未能解决你的问题,请参考以下文章