union是否支持灵活的阵列成员?

时间:2017-09-15 06:49:18

标签: c c99 unions flexible-array-member

我已经在联合中声明了一个灵活的数组成员,如下所示:

#include  <stdio.h>

union ut
{
    int i;
    int a[]; // flexible array member
};

int main(void)
{
    union ut s;
    return 0;
}

和编译器给出错误:

source_file.c:8:9: error: flexible array member in union
     int a[];

但是,声明的数组大小如下:

union ut
{
    int i;
    int a[0]; // Zero length array
};

它工作正常。

为什么零长度数组可以很好地结合使用?

3 个答案:

答案 0 :(得分:6)

不,工会不支持灵活的阵列成员,只支持结构。 C116.7.2.1§18

  

作为一种特殊情况,结构的最后一个元素有多个   命名成员可能具有不完整的数组类型;这叫做a   灵活的阵列成员

此外,零长度数组无效C,这是gcc非标准扩展。之所以能够使用它是因为你的编译器gcc被配置为编译“非标准GNU语言”的代码。如果您希望编译C编程语言的代码,则需要添加编译器选项-std=c11 -pedantic-errors

答案 1 :(得分:5)

int a[]是C标准符号(自C99起)。

int a[0]是GNU C语法,它早于C99。其他编译器也可能支持它,我不知道。

你的编译器似乎默认使用GNU扩展的C90标准,这就是后者编译的原因,但首先是编译。

此外,正如Lundin's answer中所述,标准C根本不支持union中的灵活数组成员。

尝试将-std=c99-std=c11添加到您的编译器选项(gcc docs here)。

同样-pedantic-pedantic-errors也可能是一个好主意,它会强制执行更严格的标准合规性。

而且,除了强制性,-Wall -Werror也不会伤害......

答案 2 :(得分:0)

我不确定标准会怎么说,但是G ++的并集似乎可以接受灵活的数组。如果先将它们包装在匿名结构中,就像这样:

union {
   unsigned long int  ul;
   char  fixed[4][2];
   struct {
      char  flexible[][2];
   };
};