为什么我会收到此代码的匿名类型警告?

时间:2017-09-05 13:50:45

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

编译我的项目时,我收到警告在匿名联合中声明的匿名类型是扩展名[-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名称,我只会发出此警告。但目前结构不应该是匿名类型吗?

1 个答案:

答案 0 :(得分:5)

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

  

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

警告的措辞可能会使用一些工作。 Clang允许(作为编译器扩展)未命名嵌套结构和匿名联合 * 中的其他匿名联合,所以似乎警告的作者有点懒惰并决定“匿名类型”是一个很好的解决方案。

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

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