gpt4 book ai didi

c++ - 位域的操作系统独立编程

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:52 25 4
gpt4 key购买 nike

我必须在跨越多个 DWORDS 的位域中编写独立的位。我目前正在使用如下结构

typedef struct _myStruct
{
union
{
struct
{
DWORD field1 : 16
DWORD field2 : 8
DWORD field3 : 8
};
DWORD value0;
};
union
{
struct
{
DWORD field4 : 32;
}
DWORD value1;
};
} myStruct;

我这样做是为了让程序员可以直接访问独立的字段,而不用记住相应的 DWORD,即 myStruct.field1 等。这在 Visual Studio 中运行良好,但是当我使用未命名的结构和 union 时 GCC 会提示。为了纠正这个问题,我尝试按如下方式命名 union 和结构:

    union _DW0
{
struct _BF
{
DWORD field1 : 16
DWORD field2 : 8
DWORD field3 : 8
} BF;
DWORD value0;
} DW0;

但现在访问对程序员不友好.. 即试图对此进行编程的人必须记住每个字段属于哪个 DWORD。例如:myStruct.DW0.field1

有办法解决这个问题吗?

最佳答案

位域本质上是不可移植的。当您编写 DWORD field1 : 16; 时,标准不会确定 field1 应该具有结构的高 16 位还是低 16 位。另一方面,如果您使用适当的类型和 union (在您的情况下就足够了,因为您的所有位域都与大多数平台中的类型相匹配),那么可以是可移植的。

使用 C++11 类型(您也可以使用具有适用于您平台的类型的库):

union {
struct {
uint16_t _1;
uint8_t _2;
uint8_t _3;
} field;
uint32_t value;
};
// ...

关于c++ - 位域的操作系统独立编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12118181/

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