web-dev-qa-db-ja.com

ユニオンでビットフィールドを使用することは有効ですか?

私はこのような構造のビットフィールドを使用しましたが、

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つのビットに与えられます。ユニオンでビットフィールドを使用することは誤りではないことがわかりましたが、このように使用することは操作上正しくないように思われます。では、答えは何ですか?ユニオンでビットフィールドを使用することは有効ですか?

12
amin__

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

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

18
binW

それは有効ですが、あなたが知っているように、あなたがそこでそれをした方法は役に立ちません。

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

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