livefree75 livefree75 - 4 years ago 73
C++ Question

Proper syntax for using union with bit fields inside a struct

I have the following series of structs.

struct FooWord1
{
unsigned int Fill : 8;
unsigned int someData1 : 18;
unsigned int someData2 : 6;
};

struct FooWord2
{
unsigned int Fill : 8;
union
{
unsigned int A_Bit : 1;
unsigned int B_Bit : 1;
};
unsigned int someData3 : 23;
};

struct Foo_Data
{
FooWord1 fooWord1;
FooWord2 fooWord2;
FooWord3 fooWord3; // similar to FooWord1
FooWord4 fooWord4; // similar to FooWord1
FooWord5 fooWord5; // similar to FooWord1
};

Foo_Data fooArray[SIZE];


Data gets copied into
fooArray
byte-by-byte from a network message. We get the data we expect in
someData3
if we don't use a union with the 1-bit field (
A_bit
and
B_bit
), but as soon as we put in the union, the words get "off" by 2 words.

We want to use a union there because these structures are used for different types of messages, but the meaning of
A_Bit
and
B_Bit
is different for different messages. We could just use a comment, but it would be nice to do it in code.

What am I doing wrong?

Answer Source

The answer lies in the comments to the original question. Fill, the union, and someData3 will all wind up in separate words, because the union starts a new word in the struct.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download