gpt4 book ai didi

c++ - 将 union 与结构内的位字段结合使用的正确语法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:11 29 4
gpt4 key购买 nike

我有以下一系列结构。

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 位字段(A_bitB_bit)的 union ,我们会在 someData3 中得到我们期望的数据,但是一旦我们放入并集,单词就会“减少”2 个单词。

我们想在那里使用 union ,因为这些结构用于不同类型的消息,但是A_BitB_Bit 的含义对于不同的消息是不同的。我们可以只使用注释,但最好用代码来完成。

我做错了什么?

最佳答案

你可以试试这个:

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++ 标准,而是对 . GCC 允许,MSVC——据我所知——也是。 LLVM?不确定,但通常接近 GCC,也会这样认为。

在符合标准的库中,他们经常使用宏来获得正确的效果,就像这样:

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

只是解释:使用您的原始代码,您得到了这种效果:

  • 填充开始一个新的位域
  • union 是另一种数据类型,所以前面的位字段完成
  • 在 union 内部,一个新的位字段从这里开始 我不确定这是否会创建一个位或可能是一个包含两个条目的位字段。也许任何人都可以阐明标准规定的内容...
  • 关闭 union ,位域也完成了。
  • someData3 然后开始一个新的位域

因此您要避免偏移。

关于c++ - 将 union 与结构内的位字段结合使用的正确语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39276435/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com