使用与结构内部的位字段结合的正确语法

时间:2016-09-01 16:18:05

标签: c++ struct unions bit-fields

我有以下一系列结构。

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位字段(someData3A_bit)的联合,我们会在B_bit中获得我们期望的数据,但只要我们输入工会,得到" off"用2个字。

我们希望在那里使用联合,因为这些结构用于不同类型的消息,但A_BitB_Bit的含义对于不同的消息是不同的。我们可以使用注释,但在代码中执行它会很好。

我做错了什么?

2 个答案:

答案 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

只是解释:使用原始代码,你就会产生这种效果:

  • 填写新的位字段
  • union是另一种数据类型,因此前一位字段已完成
  • 在内部联合,这里启动一个新的位字段我不确定这是创建一个位还是可能是一个包含两个条目的位字段。也许任何人都可以对标准所声明的内容有所了解......
  • 关闭联合,位字段也已完成。
  • someData3然后启动一个新的位字段

因此你想要避免偏移。

答案 1 :(得分:0)

答案在于对原始问题的评论。 let [title, , pages] = book; // notice that we can just skip unnecessary values console.log(title); console.log(pages); ------------------ Amazing book 3 Fillunion将以单独的词汇结束,因为someData3会在结构中开始一个新词。