【问题标题】:Why do I get the anonymous type warning for this code?为什么我会收到此代码的匿名类型警告?
【发布时间】:2017-09-05 13:50:44
【问题描述】:

编译我的项目时,我收到警告在匿名联合中声明的匿名类型是扩展 [-Wnested-anon-types]。我的代码包含这个联合:

union
{
    uint32_t m_bits;  // All bits
    struct
    {
      uint32_t significand : 23;
      uint32_t exponent : 8;
      uint32_t sign : 1;
    } IEEE;
  };

据网站上的其他答案所说,如果我从结构中省略了 IEEE 名称,我只会期待这个警告。但是目前struct不应该是匿名类型吗?

【问题讨论】:

  • 因为你的结构类型没有名字?
  • @Chiel 匿名结构和未命名结构之间存在差异。你指的是后者。
  • @Rakete1111。你是对的。我不知道。

标签: c++ clang++ anonymous-types


【解决方案1】:

因为标准是这样说的([class.union.anon]):

注意:嵌套类型,匿名 联合,并且函数不能在匿名联合中声明。

不过,警告的措辞可能需要一些工作。 Clang 允许(作为编译器扩展)unnamed 嵌套结构和匿名联合* 内的其他匿名联合,因此警告的作者似乎有点懒惰并决定“匿名类型”是一个很好的包罗万象。

请注意,为您的 union 命名(因此联合不再是匿名的)会使警告消失。

*在匿名联合中仍然不允许使用命名结构(并且没有匿名结构之类的东西)

【讨论】:

  • 所以警告真的应该说在匿名联合中声明的任何类型都是扩展吗?
  • @nitronoid:是的,这是我的信念。
  • 我明白了,多么令人困惑。也感谢您的解决方案!
  • @ArtemyVysotsky 该结构目前未命名,但不是匿名的。
  • @ArtemyVysotsky:该结构未命名不是匿名的。 Clang 允许(作为扩展)匿名联合中的未命名嵌套结构。它不允许在匿名联合中声明命名结构。
猜你喜欢
  • 1970-01-01
  • 2021-09-05
  • 2012-08-10
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 2021-06-13
  • 2012-07-27
  • 1970-01-01
相关资源
最近更新 更多