编译我的项目时,我收到警告在匿名联合中声明的匿名类型是扩展名[-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
名称,我只会发出此警告。但目前结构不应该是匿名类型吗?
答案 0 :(得分:5)
因为标准是这样说的([class.union.anon]):
注意:嵌套类型,匿名 联盟和函数不能在匿名联盟中声明。
警告的措辞可能会使用一些工作。 Clang允许(作为编译器扩展)未命名嵌套结构和匿名联合 * 中的其他匿名联合,所以似乎警告的作者有点懒惰并决定“匿名类型”是一个很好的解决方案。
请注意,为union
命名(因此联合不再是匿名)会使警告消失。
*在匿名联合中仍然不允许使用命名结构(并且没有匿名结构这样的东西)