2012-02-04 15 views
14

anonimowych kodowanym zostały dodane w standardzie C11, więcC11 anonimowe struktury przez typedefs?

typedef struct { 
    struct {int a, b}; 
    int c; 
} abc_struct; 

jest ważna i standard. Czy to także w standardzie używać typedef zamiast pełnej deklaracji struct? Np .:

typedef struct { 
    int a, b; 
} ab_struct; 

typedef struct { 
    ab_struct; 
    int c; 
} abc_struct; 

Dokumentacja GCC mówi, że jest to przedłużenie Plan 9, ale to działa w kilku kompilatorów próbowałem (w tym GCC ...). Czytając sam standard, myślę, że jest OK, ale jest to rodzaj bliskiego czytania, który łatwo zepsuć.

Odpowiedz

9

To było najwyraźniej zadane w pytaniu do komitetu C przez Josepha S. Myersa z zespołu gcc. Odpowiedź brzmi: nie, nie jest poprawna w C11.

Patrz odpowiedź tutaj:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1549.pdf

i komentować Myersa:

tym tygodniu Londyn WG14 spotkania zgodzili się zabronić używania typedefs w deklarując anonimowych pól struktury i związkowych, zgodnie N1549.

źródło http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01151.html

Pytanie zostało zadane w SC22WG15.12205 zobaczyć 5,28 SC22WG14.12205 anonimowy Konstrukcje (N1425) w http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1490.pdf

0

Cóż, obawiam się, że nie przeszkadza, aby uzyskać jeszcze gotowego standardu, ale oto co ostateczny projekt mówi:

  • Anonimowy członek, którego specyfikacja typu jest specifier struktura bez znacznika jest nazywana anonimową strukturą; nienazwany członek, którego specyfikator typu jest specyfikatorem unii bez znacznika, nazywany jest anonimowym związkiem.

Mogę tylko interpretować, ponieważ tylko struct {}; i union {}; może być anonimowy struct/union.

4

Właściwie Twój drugi fragment jest pełen niebezpieczeństw i nie jest odpowiednik pierwszego bez wyraźnego określenia -fplan9-extensions w gcc.

W szczególności ab_struct; deklaracja w wierszu 6 nic nie robi (jak na ostrzeżenie gcc). Wystarczy wklejenie drugi fragment w foo.c generuje:

foo.c:6: warning: declaration does not declare anything 

A zwłaszcza jeśli było spróbować:

typedef struct { 
    int a, b; 
} ab_struct; 

typedef struct { 
    ab_struct; 
    int c; 
} abc_struct; 


int main() { 
    abc_struct abc; 
    abc.a = 5; 
    return 0; 
} 

dostaniemy błąd składni w wierszu 13 abc.a = 5; bez -fplan9-extensio.

podczas korzystania z głównego fragmentu anonimowa struktura będzie działać tak, jak myślisz, że powinna.Mianowicie:

typedef struct { 
    struct { 
      int a, b; 
    }; 
     int c; 
} abc_struct; 


int main() { 
    abc_struct abc; 
    abc.a = 5; 
    return 0; 
}