2017-11-18 197 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

相關問題