我已经在联合中声明了一个灵活的数组成员,如下所示:
#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
};
它工作正常。
为什么零长度数组可以很好地结合使用?
答案 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];
};
};