我必须在跨越多个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中效果很好,但是当我使用未命名的结构和联合时,GCC会抱怨。为了更正我尝试如下命名联合和结构:
    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位。另一方面,如果您使用适当的类型和联合(在您的情况下就足够了,因为在大多数平台上所有位字段都与一种类型匹配),那么它们可以移植。

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

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

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

10-13 07:08