我有以下一系列结构。
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];
数据从网络消息逐字节地复制到fooArray
。如果我们不使用带有1位字段(someData3
和A_bit
)的联合,我们会在B_bit
中获得我们期望的数据,但只要我们输入工会,得到" off"用2个字。
我们希望在那里使用联合,因为这些结构用于不同类型的消息,但A_Bit
和B_Bit
的含义对于不同的消息是不同的。我们可以使用注释,但在代码中执行它会很好。
我做错了什么?
答案 0 :(得分:0)
你可以试试这个:
struct FooWord2
{
union
{
struct
{
unsigned int Fill : 8;
unsigned int A_Bit : 1;
unsigned int someData3 : 23;
};
struct
{
unsigned int : 8;
unsigned int B_Bit : 1;
};
};
};
需要提一下:根据这个answer,匿名结构不是C ++标准,而是扩展为。海湾合作委员会允许,MSVC - 据我记得 - 也是如此。 LLVM?不确定,但往往接近GCC,也会这样认为。
在标准的符合库中,他们使用宏来获得正确的效果,如下所示:
struct FooWord2
{
unsigned int Fill : 8;
unsigned int A_Bit : 1;
unsigned int someData3 : 23;
};
#define B_Bit A_Bit
只是解释:使用原始代码,你就会产生这种效果:
因此你想要避免偏移。
答案 1 :(得分:0)
答案在于对原始问题的评论。 let [title, , pages] = book; // notice that we can just skip unnecessary values
console.log(title);
console.log(pages);
------------------
Amazing book
3
,Fill
和union
将以单独的词汇结束,因为someData3
会在结构中开始一个新词。