静态const匿名联合使用GCC 4.9.3给出“未初始化的const”错误

时间:2015-09-17 23:26:41

标签: c++ gcc compilation compiler-errors unions

编译以下内容时:

const static union {
    float cMaskF;
    int cMask = -1;
};

x86_64-w64-mingw32-gcc-5.2.0成功,而i686-pc-cygwin-gcc-4.9.24.9.3都会出现以下错误:

  

未初始化的const'Uphil :: Math :: {anonymous} ::'[-fpermissive]

但是,以下情况也会产生错误,这是可以理解的......

const static union {
    float cMaskF = 1.0f;
    int cMask = -1;
};
  

union'Uphil :: Math :: {anonymous} ::'initialized

中的多个字段      

初始化'Uphil :: Math :: {anonymous} ::'

的多个成员

那么有没有办法让const静态匿名联合一致地编译?这是修复的旧版本中的错误,还是我不应该想要的“非标准”代码?无论如何,这似乎是一个有用的结构。

这都是在C ++ 11下编译的。即使使用-pedantic,v5.2.0也会在没有任何警告的情况下成功。

1 个答案:

答案 0 :(得分:1)

据我所知,这似乎是允许const匿名联盟的gcc扩展。这适用于example with gcc 5.2的更高版本的gcc。看起来使其适用于旧版本的唯一方法是使用-fpermissive标志,该标志降低了对不符合代码的警告,但这可能并不理想。

另一方面,如果我们使用clang尝试此代码,如果我们使用-pedantic标记( see it live ),则会提供以下警告:

  

警告:匿名工会不能成为' const' [-Wpedantic]

我们可以找到一个gcc错误报告:type-specifier const in declaration of anonymous union声称由于7.1.6.1 [dcl.type.cv] 而导致其格式不正确:

  

如果cv-qualifier出现在decl-specifier-seq中,那么   声明的init-declarator-list不应为空。

据我所知,这是正确的。我们被迫通过9.5 [class.union] 部分中匿名联合的定义得到一个空的 init-declarator-list

  

表格

的联合
union { member-specification } ;
     

被称为匿名联盟;它定义了一个未命名的未命名对象   类型。