2017-11-18 1 views
0

구문 :struct에서이`data [0]`선언의 목적은 무엇입니까? 이런 <strong>가요 어레이 부재</strong>의 C에서

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 크기가 0 인 배열이 잘못되었습니다. 그런 다음

,

  • 구조체에서이 data[0] 선언의 목적은 무엇인가

    ?
  • data[0]의 기능은 무엇입니까?
+1

@chux 특히 GNU GCC와 Clang. 그러나 M $ VC는 길이가 0 인 배열을 거부합니다. – iBug

+1

그래서 얼마나 많은 복제본이 있는지에 대해 구글도하지 않았습니까? –

답변

3

유연한 배열 구성원을 구현하는 유일한 방법은 C99 (1999 년에 릴리스 된 C의 ISO 표준 버전)보다 먼저 컴파일러에서 확장으로 지원하는 경우입니다. GCC는 정적 길이 0을 사용하여이를 지원했습니다. 따라서 foo buffer[0]입니다.

C99은 합법적 이었지만 GCC의 [0] 버전을 유지하는 대신 foo buffer[] 구문을 사용하기로 결정했습니다.

GCC는 여전히 C99 이전에 작성된 코드와의 호환성을 위해 buffer[0]을 지원합니다. 이것은 GCC의 문서에 설명되어

: https://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Zero-Length.html (강조 광산) :

길이가 0 인 배열

참고 GNU C에서 허용되는 "GNU C"(GCC의 구현 C)는 ISO C의 자체 확장 기능을 가지고 있습니다.

+0

예. GCC는'-std = c99'뿐만 아니라'-std = gnu99'도 허용합니다. – iBug

+4

이 질문에 답해야 할 횟수는 몇 번입니까? –

+1

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

관련 문제