2013-04-24 22 views
6

私はバイト、ニブルとビット操作を簡素化するために、次の組合を使用します。C++匿名の構造体

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

それは素敵な作品が、それはまた、この警告を生成:

警告:ISO C++が匿名を禁止します構造体[-pedantic]

しかし、...私のg ++​​出力からこの警告をどのように得るには?この問題のないこの組合のようなものを書く可能性はありますか?

+2

なぜ単にあなたの構造体に名前を付けますか? –

+3

あなたは、有効なC++の領域内でやろうとしていることをすることはできません。それは動作するかもしれませんが、未定義の動作になります。 –

+0

名前を付けることができます。たとえば、構造体のニブルを作成し、それを共用体のフィールドにします。しかし、私はByte.nibbles.nibble_0にアクセスしなければなりません。使用するのはあまりいいことではありません;)。 – Dejwi

答えて

4

gccコンパイラオプション-fms-extensionsは、警告なしで非標準匿名構造体を許可します。

(それはそれは、「Microsoft拡張機能」と考えるものができます)

また、この規則を使用して有効なC++で同じ効果を得ることができます。これにより

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

、あなたの非標準byte.nibble_0になる法的byte.nibble._0

+2

先頭のアンダースコアについては正しいです。アンダースコアで始まるグローバル名前空間内の名前は、実装に予約されています。アンダースコアで始まり大文字に続く名前、または二重アンダースコアを含む名前も実装に予約されています。 - 17.6.4.3.2(C++ 11)を参照してください。 –