我已经在联盟中声明了一个灵活的数组成员,像这样:

#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
};

而且效果很好。
为什么零长数组可以很好地合并?

最佳答案

不,工会不支持灵活的数组成员,只支持。C11 6.7.2.1第18条
特殊情况下,结构的最后一个元素
命名成员的数组类型可能不完整;这称为
挠性阵列构件。
此外,零长度数组不是有效的c,这是gcc的非标准扩展。之所以这样做是因为编译器gcc被配置为编译“非标准gnu语言”的代码。如果您希望让它为C编程语言编译代码,则需要添加编译器选项-std=c11 -pedantic-errors

关于c - union 会支持灵活的数组成员吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46233400/

10-11 19:02