2013-04-24 9 views
6

używam następujący związek uprościć bajt skubać i bitowe operacje:C++ anonimowych kodowanym

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

Działa ładne, ale również generuje to ostrzeżenie:

ostrzeżenie: ISO C++ zabrania anonimowy structs [-pedantic]

Dobrze wiedzieć. Ale ... jak uzyskać to ostrzeżenie z mojego wyjścia g ++? Czy istnieje możliwość napisania czegoś podobnego do tego związku bez tego problemu?

+2

Dlaczego nie po prostu nazwać struct? –

+3

Nie będziesz w stanie zrobić tego, co chcesz zrobić w domenach prawidłowego C++. To może działać, ale będzie to niezdefiniowane zachowanie. –

+0

Potrafię to nazwać - na przykład ukłucie struktury i uczynienie z niej pola związku. Ale wtedy będę musiał uzyskać do niego dostęp Byte.nibbles.nibble_0. Nie będzie tak przyjemnie korzystać;). – Dejwi

Odpowiedz

4

Opcja kompilatora gcc -fms-extensions umożliwia niestandardowe anonimowe struktury bez ostrzeżenia.

(która umożliwia co uzna „rozszerzenia Microsoft”)

można również osiągnąć ten sam efekt w ważnego C++ używając tej konwencji.

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

Dzięki temu Twój niestandardowy byte.nibble_0 staje się prawnym byte.nibble._0

+2

Masz rację co do wiodącego podkreślenia. Nazwy w globalnej przestrzeni nazw, które zaczynają się od podkreślenia, są zarezerwowane dla implementacji. Nazwy zaczynające się od podkreślenia poprzedzonego wielką literą lub zawierające podwójne podkreślenia są również zastrzeżone dla implementacji. - Patrz 17.6.4.3.2 (C++ 11) –