2012-07-04 8 views
8

私はこのような構造を持つビットフィールドを使用していた、ビットフィールドを共用体で使用することは有効ですか?

struct 
{ 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
} flags; 

は今、私は、これは労働組合で行うことができるかどうかを確認するために疑問に思ったので、私は、のような

union 
{ 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
} flags; 

をコードを変更し、私が見つかりました。ユニオンのあるビットフィールドは動作しますが、ユニオンのすべてのフィールドは出力から理解したように1ビットに与えられます。今私はそれがユニオンでビットフィールドを使用する間違いではないが見ているが、それはこのように使用することは、操作上は正しいと私には思われる。だから答えは何ですか - それは合併でビットフィールドを使用することは有効ですか?

+0

を、正確に何が動作しませんしてください? – alk

答えて

12

あなたは銃と弾丸が与えられています。それで足で自分を撃っても大丈夫ですか?もちろん、そうではありませんが、あなたが望むなら、誰もこれをやめさせることはできません。

私の主張は、銃や弾丸のように、ユニオンとビットフィールドはツールであり、その目的、使用方法、および「悪用」があります。上で書いたように、ユニオンでビットフィールドを使うと、完全に有効なCですが、役に立たないコードです。共用体内のすべてのフィールドは同じメモリを共有しているため、言及したすべてのビットフィールドは基本的に同じフラグを持ち、同じメモリを共有します。

12

これは有効ですが、わかったように、あなたがそこでやったやり方は役に立たないです。

フラグを使用してすべてのビットを同時にリセットできるように、このようなことを行う場合があります。

union { 
    struct { 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
    }; 
    unsigned int flags; 
}; 

それとも、このような何かがあります

union { 
    struct { 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
    }; 
    struct { 
     unsigned int is_ready: 1; 
     unsigned int is_done: 1; 
     unsigned int is_waiting: 1; 
    }; 
}; 
+1

匿名の構造が必要だと仮定して、セミコロンをいくつか追加しました。また、標準ではないことにも注意してください。C. gccでは、これらを動作させるには '-fms-extensions'を使う必要があります。 – unkulunkulu

関連する問題