2013-04-24 24 views
6

Io uso il seguente unione per semplificare byte, sgranocchiare e bit operazioni:C++ struct anonimi

union Byte 
{ 
    struct { 
    unsigned int bit_0: 1; 
    unsigned int bit_1: 1; 
    unsigned int bit_2: 1; 
    unsigned int bit_3: 1; 
    unsigned int bit_4: 1; 
    unsigned int bit_5: 1; 
    unsigned int bit_6: 1; 
    unsigned int bit_7: 1; 
    }; 

    struct { 
    unsigned int nibble_0: 4; 
    unsigned int nibble_1: 4; 
    }; 

    unsigned char byte; 
}; 

Funziona bello, ma genera anche questo avvertimento:

avvertimento: ISO C++ vieta anonima structs [-pedantic]

Ok, bello sapere. Ma ... come ottenere questo avviso dal mio output g ++? C'è la possibilità di scrivere qualcosa come questa unione senza questo problema?

+2

Perché non semplicemente il nome del tuo struct? –

+3

Non sarai in grado di fare ciò che stai cercando di fare nei regni del C++ valido. Potrebbe funzionare, ma sarà un comportamento indefinito. –

+0

Posso nominarlo, ad esempio struct nibbles e renderlo un campo di unione. Ma poi dovrò accedervi Byte.nibbles.nibble_0. Non sarà così bello da usare;). – Dejwi

risposta

4

L'opzione del compilatore gcc -fms-extensions consentirà le strutture anonime non standard senza preavviso.

(Che consente ciò che considera "estensioni Microsoft")

È inoltre possibile ottenere lo stesso effetto in valido C++ utilizzando questa convenzione.

union Byte 
{ 
    struct bit { 
    unsigned int _0: 1; 
    unsigned int _1: 1; 
    unsigned int _2: 1; 
    unsigned int _3: 1; 
    unsigned int _4: 1; 
    unsigned int _5: 1; 
    unsigned int _6: 1; 
    unsigned int _7: 1; 
    }; 
    struct nibble { 
    unsigned int _0: 4; 
    unsigned int _1: 4; 
    }; 
    unsigned char byte; 
}; 

Con questo, il vostro non standard byte.nibble_0 diventa il legale byte.nibble._0

+2

Hai ragione sul trattino basso principale. I nomi nello spazio dei nomi globale che iniziano con un carattere di sottolineatura sono riservati all'implementazione. I nomi che iniziano con un carattere di sottolineatura seguito da una lettera maiuscola o che contengono doppi caratteri di sottolineatura sono anche riservati all'implementazione. - Vedi 17.6.4.3.2 (C++ 11) –