c++ - 位域结构列表

标签 c++ oop

我有以下位域结构:

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. “这与每个成员都是 1 个字节长的结构一样吗?”

    如果您不使用 #pragma pack 或类似的东西,您的编译器可能会添加填充。

    但在这种特定情况下不需要任何填充,所以基本上答案是肯定的。

    只需将 unsigned short 更改为 unsigned char,每个成员将是 1 个字节长。

  2. 添加“.”在每个字段的左侧:

    DescriptorByte ADD_8_OI = { .IsImmedCalc = true, .Size = 1 };

    或者,只需按正确的顺序写入实际值(缺少的值将设置为 0):

    DescriptorByte ADD_8_OI = { true, 1 };

关于c++ - 位域结构列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21195534/

相关文章:

C++ - 谷歌protobuf

php - 为什么 PHP 不自动调用父构造函数?

php - 创建自己的PHP框架,如何向页面 Controller 发送参数

c++ - 咖啡 "Unknown solver type : SGD"

c# - 无需安装的 C++ 数据库访问

java - 如何从事件监听器的语句中调用函数?

c++ - 将任何对象传递给函数以创建此对象

java - 安全使用元素

c++ - 如何在 Vulkan 中使用 DepthBuffer 作为 InputAttachment?

c++ - 如何使用 CLion 在 MAC OS X 上发出 EOF 信号