【问题标题】:C++ build warning : dereferencing type-punned pointer will break strict-aliasing rulesC++ 构建警告:取消引用类型双关指针将破坏严格别名规则
【发布时间】: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 一篇出色的文章,涵盖了所有的如果,但可能与您正在尝试做的事情相关联。祝你好运!
  • 不知道代码应该做什么,很难帮助你。代码的行为将是特定于平台的,在不了解您的平台的情况下,我们无法知道它应该做什么。有办法做它正在做的任何事情,但我们不知道那是什么。

标签: c++ pointers casting


【解决方案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 节目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-26
      • 2011-11-29
      • 1970-01-01
      • 2017-09-22
      • 2014-12-30
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      相关资源
      最近更新 更多