2017-11-18 184 views
0

在C,柔性阵列构件的语法如下:在struct中这个`data [0]`声明的目的是什么?

struct s 
{ 
    int n; 
    double d[]; // flexible array member 
}; 

而且,零尺寸数组中C.

非法

如果我声明阵列是这样的:

struct s 
{ 
    double d[0]; // Zero size array 
}; 

GCC给出警告:

warning: ISO C forbids zero-size array 'd' [-Wpedantic] 

所以,我要谈我的主要问题。

我看到下面的代码here

struct squashfs_xattr_entry { 
    __le16   type; 
    __le16   size; 
    char   data[0]; 
}; 

在C零大小数组非法。

然后,

  • 什么是结构这个data[0]声明的目的是什么?
  • data[0]在这里做什么?
+1

@chux特别是GNU GCC和Clang。然而,M $ VC拒绝零长度数组。 – iBug

+1

所以你甚至没有谷歌有多少重复呢?! –

回答

3

在C99之前(1999年发布的C的ISO标准版本)实现灵活数组成员的唯一方法是编译器支持它作为扩展。 GCC通过使用一个固定长度0来支持它,因此foo buffer[0]

C99使它合法,但他们决定规定语法foo buffer[]而不是保留GCC的[0]版本。

GCC仍支持buffer[0]与C99之前编写的代码兼容。

这是海湾合作委员会的文件中解释说:https://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Zero-Length.html(重点煤矿):

零长度数组被允许在GNU C

需要注意的是 “GNU C”(海湾合作委员会实现的C)在ISO C的顶部有它自己的扩展。

+0

是的。 GCC不仅接受'-std = c99',还接受'-std = gnu99'。 – iBug

+4

这个问题需要回答多少次? –

+1

@AnttiHaapala https://www.youtube.com/watch?v=FGBhQbmPwH8;) – Stargateur

相关问题