17

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

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

4

3 に答える 3

37

それは有効ですが、あなたが見つけたように、そこで行った方法では役に立ちません。

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

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;
    };
};
于 2012-07-04T09:55:21.397 に答える
10

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

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

于 2012-07-04T09:54:07.310 に答える