2
struct TestStruct
{   
    int a;
    int b;

    union
    {
        char c[2];
        int d;
    };
};

TestStruct instance;

私が行った場合

instance.a = 100; 
instance.b = 200; 
instance.d = 300;

すべて順調。

しかし、ユニオンに名前を付けると、次のようになります。

struct TestStruct
{   
    int a;
    int b;

    union ZZZ // Note here!!
    {
        char c[2];
        int d;
    };
};

TestStruct instance;

そして、私は再び同じことをします:

instance.a = 100;
instance.b = 200;
instance.ZZZ::d = 300;

それから

instance.ZZZ::d = 300;

上書きなのですinstance.a300、なぜ?!

さらに、名前がある場合、デバッガーのウォッチ リストにユニオン メンバーが表示されません。

Visual Studio 2008 を使用しています。

4

1 に答える 1

9

ユニオンに名前を付けると、対応するクラスにデータメンバーがなくなるため、d何のinstance.ZZZ::d = 300;意味もありません。(VS2012 では、「エラー C2039: 'ZZZ' : 'TestStruct' のメンバーではありません」というメッセージが表示されます)

ユニオンタイプのメンバーを持つには、名前を付ける必要があります。

struct TestStruct
{   
    int a;
    int b;

    union ZZZ // Note here!!
    {
        char c[2];
        int d;
    } z;
};

instance.a = 100;
instance.b = 200;
instance.z.d = 300;

C++ には「無名共用体」に関する特別なルールがあり、フォームの名前のない共用体型も名前のないオブジェクトを作成します。共用体のメンバーの名前は、外側のスコープに注入され、名前のないオブジェクトのメンバーにアクセスします。union { member-specification };

これは、クラス内でユニオン型に名前を付けない場合に得られるものです。しかし、型に名前を付けるとすぐに、ユニオンはその特別なルールに一致しなくなり、クラスに名前のないユニオン メンバーはなくなります。次に、メンバー変数に名前を付けて、通常どおりユニオン データ メンバーを追加する必要があります。

于 2013-10-07T10:59:36.240 に答える