gpt4 book ai didi

c++ - C/C++ 中的嵌套位域

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

我需要创建一个带有位域的结构来封装一些来自硬件的数据。假设我使用特定于编译器的机制来强制打包和排序,是否可以创建类似于以下的结构(语法不正确):

typedef struct _BYTE_OF_DATA
{
uint8_t Reserved1 : 2;
struct
{
uint8_t BitWithSomeMeaning : 1;
uint8_t BitWithSomeOtherMeaning : 1;
} BitsWithMeaning;
uint8_t Reserved2 : 4;
} BYTE_OF_DATA, *PBYTE_OF_DATA;

static_assert(sizeof(BYTE_OF_DATA) == 1, "Incorrect size");

然后可以按如下方式访问:

BYTE_OF_DATA byteOfData;

byteOfData.Reserved1 = 1;
byteOfData.BitsWithMeaning.BitWithSomeOtherMeaning = 0;

我上面描述的确切方案将不起作用,因为我猜想结构 BitsWithMeaning 需要从字节边界开始。我想知道是否有其他技巧可以实现位域的这种“嵌套”。

最佳答案

为了详细说明我之前的评论,这些内容应该允许您想要的访问方式。尽管以一种远非优雅的方式:

typedef union _BYTE_OF_DATA {
struct {
uint8_t Reserved1 : 2;
uint8_t : 2;
uint8_t Reserved2 : 4;
};
struct {
uint8_t : 2;
uint8_t BitWithSomeMeaning : 1;
uint8_t BitWithSomeOtherMeaning : 1;
uint8_t : 4;
} BitsWithMeaning;
} BYTE_OF_DATA, *PBYTE_OF_DATA;

就我个人而言,我更喜欢传统的字段掩码和位置常量并手动修改寄存器。我的经验是,以这种方式访问​​可变 I/O 位域总是会导致代码效率低下且容易出现竞争。

关于c++ - C/C++ 中的嵌套位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29171768/

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