2012-02-04 17 views
14

le strutture anonimi sono stati aggiunti nello standard C11, cosìC11 strutture anonime via typedef?

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

è valido e standard. È anche nello standard utilizzare un typedef al posto della dichiarazione di struct completa? Es .:

typedef struct { 
    int a, b; 
} ab_struct; 

typedef struct { 
    ab_struct; 
    int c; 
} abc_struct; 

La documentazione GCC dice che questa è un'estensione Plan 9, ma poi si lavora nelle pochi compilatori che ho provato (tra cui GCC ...). Leggendo lo standard stesso, penso che sia OK, ma questo è il tipo di lettura ravvicinata che è facile da rovinare.

risposta

9

Questo è stato apparentemente chiesto in una domanda al comitato C di Joseph S. Myers della squadra gcc. E la risposta è no, non è valida in C11.

vedere la risposta qui:

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

E il commento di Myers:

riunione di Londra WG14 di questa settimana hanno deciso di non consentire l'uso di typedef nel dichiarare struttura e sindacali campi anonimi, come da N1549.

fonte http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01151.html

La domanda è stata posta in SC22WG15.12205 vedere 5,28 SC22WG14.12205, strutture anonime (N1425) in http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1490.pdf

0

Ebbene, temo che non ho preso la briga di ottenere lo standard finita ancora, ma ecco quello che la bozza finale dice:

  • Un membro anonimo il cui identificatore di tipo è una specifica struttura senza tag è chiamato una struttura anonima; un membro senza nome il cui identificatore di tipo è un identificatore di unione senza tag è chiamato unione anonima.

Posso solo interpretare il modo che solo struct {}; e union {}; può essere una struttura/unione anonima.

4

In realtà il secondo frammento è pieno di pericoli e non è equivalente al primo senza specificare esplicitamente -fplan9-extensions in gcc.

In particolare ab_struct; dichiarazione sulla linea 6 NON fa NULLA (come da avviso di gcc). Basta incollare il secondo frammento in foo.c genera:

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

E in particolare se si dovesse provare:

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; 
} 

si otterrebbe un errore di sintassi sulla linea 13 abc.a = 5; senza il -fplan9-extensio.

mentre utilizzando lo snippet di livello superiore la struttura anonima funzionerà come si pensa dovrebbe.Vale a dire:

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


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