我有以下位域结构:
struct DescriptorByte
{
unsigned short IsImmedCalc : 1;
unsigned short IsPrefix : 1;
unsigned short NoMemOp : 1;
unsigned short Size : 5;
};
我想创建一个表来保存许多 DescriptorByte 结构,所以我创建了这个:
struct OpcodeList
{
DescriptorByte ADD_8_MO;
DescriptorByte ADD_32_MO;
DescriptorByte ADD_8_OM;
DescriptorByte ADD_32_OM;
DescriptorByte ADD_8_OI = { TRUE, FALSE, TRUE, 1 + 1 };
DescriptorByte ADD_32_OI = { TRUE, FALSE, TRUE, 1 + 4 };
DescriptorByte PUSH_ES = { TRUE, FALSE, TRUE, 1 };
};
那么这是否与每个成员都为 1 个字节长的结构相同?我也希望能够像这样引用初始化器成员:
DescriptorByte ADD_8_OI = { IsImmedCalc = true, Size = 1 };
但是 visual studio 不允许我这样做。所有这一切背后的想法是有一个 DescriptorByte 表,这是最好的方法吗?还有什么是最好的初始化方法?谢谢。
最佳答案
“这与每个成员都是 1 个字节长的结构一样吗?”
如果您不使用
#pragma pack
或类似的东西,您的编译器可能会添加填充。但在这种特定情况下不需要任何填充,所以基本上答案是肯定的。
只需将
unsigned short
更改为unsigned char
,每个成员将是 1 个字节长。添加“.”在每个字段的左侧:
DescriptorByte ADD_8_OI = { .IsImmedCalc = true, .Size = 1 };
或者,只需按正确的顺序写入实际值(缺少的值将设置为 0):
DescriptorByte ADD_8_OI = { true, 1 };
关于c++ - 位域结构列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21195534/