2009-05-12 6 views
1

私はこのように定義された労働組合があります。ユニオンの内部メンバーにアクセスするにはどうすればよいですか?

typedef union { 
    enum { 
    REVISION = 0, 
    CURRENT_VERSION = REVISION 
    }; 

    enum FLAGS{ 
    FLAG_DEFAULT    = 0x00000000, 
    FLAG_EOD     = 0x00000001, 
    FLAG_OUTOFORDER   = 0x00000002 
    }; 

    CHAR _filler[32]; 

    struct INTERNAL_STRUCTURE { 
    UINT16 type; 
    UINT16 flags; 
    }; 
}CORRHDR 

私はメンバーのINTERNAL_STRUCTUREの私のコードからアクセスするにはどうすればよいですか?

私はちょうどこれを行うことができると思ってきました:

CORRHDR hdr; 
hdr.INTERNAL_STRUCTURE.type = 1; 

私が間違っています。私は組合のenumを見ることができますが、他には何もありません。誰かが私にこのタイプの構造(または利益)を説明できますか?

答えて

5

タイプINTERNAL_STRUCTUREといいますが、そのタイプの実際のインスタンスではありません。フィールドにアクセスするためにその後

typedef union { 
    //... 
    CHAR _filler[32]; 
    struct { 
    UINT16 type; 
    UINT16 flags; 
    } INTERNAL_STRUCTURE; 
}CORRHDR; 

:これを試してみてください

CORRHDR ch; 
printf("%u\n", ch.INTERNAL_STRUCTURE.type); 
+0

[私は窓にUNIXシステムからの移植てる]:

あなたはその構造体の型の変数を定義する必要があります。このように(インスタンス名のない共用体の中で)構造体を定義できるかどうかは、共用体に含まれるバイナリ・データの開発者参照にすぎませんか? – scottm

+0

はい、与えられた宣言で、あなたはreinterpret_cast (ch._filler) - >型のようなものを使って内部のデータにアクセスできますが、それは扱いにくいようです。 –

1

あなたは、あなたがそれにアクセスしようとする前に、タイプINTERNAL_STRUCTUREのオブジェクトを定義する必要があります。今のあなたの組合には1つもありません。試してみてください:

struct INTERNAL_STRUCTURE { 
    UINT16 type; 
    UINT16 flags; 
    }; 
struct INTERNAL_STRUCTURE is; 

...

0

をあなたはINTERNAL_STUCTURE

名前付きの型

ないINTERNAL_STRUCTURE名前付きインスタンスを定義しました。

typedef union { 
    enum { 
    REVISION = 0, 
    CURRENT_VERSION = REVISION 
    }; 

    enum FLAGS{ 
    FLAG_DEFAULT    = 0x00000000, 
    FLAG_EOD     = 0x00000001, 
    FLAG_OUTOFORDER   = 0x00000002 
    }; 

    CHAR _filler[32]; 

    struct { 
    UINT16 type; 
    UINT16 flags; 
    } INTERNAL_STRUCTURE; 
}CORRHDR; 
0

また、構造体を定義しますが、使用しないでください。

union Blob 
{ 
    CHAR _filler[32]; 

    struct INTERNAL_STRUCTURE { 
    UINT16 type; 
    UINT16 flags; 
    } myStruct; 
}; 

CORRHDR hdr; 
hdr.myStruct.type = 1;