gcc不再允许空数组吗?

时间:2013-01-09 18:19:18

标签: c arrays gcc initialization

我有gcc 4.7.2-3,我收到以下错误:

main.c:5:6:错误:'fname'

中缺少数组大小

main.c:6:6:错误:'lname'中缺少数组大小

初始化时:

int fname[];
int lname[];

使用更高版本的gcc不再可能吗?因为我确定我以前用过这个......

编辑:我说我记得这个的原因是因为我在这里看到它: http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V40F_HTML/AQTLTBTE/DOCU_046.HTM

4 个答案:

答案 0 :(得分:2)

如果您要立即初始化数组,则只能声明一个没有大小的数组

int myarr[] = {1, 2, 3};

或者它是否是结构中的最后一个成员

struct foo {
  int something;
  int somethingelse;
  char emptyarr[];
};

答案 1 :(得分:1)

零长度数组可以是C99中引入的GNU C extension or a flexible array member(C ++编译器也恰好支持,我不确定它是否符合C ++标准)。在任何一种情况下,这些都被允许作为结构的最后一个成员,否则是不允许的,也没有任何意义。

您引用的文档确实使用或显示“空”数组。您将array decaying混淆为“空”数组。

答案 2 :(得分:0)

我认为在任何编译器中都不可能,编译时必须知道数组大小。您可能正在进行初始化:

int fname[] = { 1, 2, 3};

这样编译器可以导出大小。

编辑:啊,错过了“C”标签。 :)但它在C ++中似乎是非法的。

答案 3 :(得分:0)

是的,你可以声明一个0大小的数组。为此,您需要声明如下所述

int array[] = {};

例如

int main()
{
    int a[]={};
    printf("size = %d", sizeof(a));
    return 1;
}

./a.out为0输出。