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

nit*_*oid 1 c++ anonymous-types clang++

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

union
{
    uint32_t m_bits;  // All bits
    struct
    {
      uint32_t significand : 23;
      uint32_t exponent : 8;
      uint32_t sign : 1;
    } IEEE;
  };
Run Code Online (Sandbox Code Playgroud)

至于网站上的其他答案已经说过,如果我IEEE从结构中省略了名称,我只会期望这个警告.但目前结构不应该是匿名类型?

And*_*dyG 5

因为标准如此说明([class.union.anon]):

注意:无法在匿名联合中声明嵌套类型,匿名联合和函数.

但是,警告的措辞可能会使用一些工作.Clang允许(作为编译器扩展)未命名的嵌套结构和匿名联合*中的其他匿名联合,所以看起来警告的作者只是有点懒惰并且决定"匿名类型"是一个很好的捕获.

请注意,给出union一个名称(因此联合不再是匿名)会使警告消失.

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

  • @ArtemyVysotsky结构目前未命名,但它不是匿名的. (2认同)