1

複数のDWORDにまたがるビットフィールドに独立したビットをプログラムする必要があります。私は現在、次のような構造体を使用しています

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

これは、プログラマーが独立したフィールドに直接アクセスできるようにするためであり、対応するDWORDmyStruct.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

これを回避する方法はありますか?

4

2 に答える 2

1

ビットフィールドは本質的に移植性がありません。DWORD field1 : 16;標準を作成する場合field1、構造体の上位16ビットと下位16ビットのどちらを使用するかは決定されません。一方、適切な型と共用体を使用する場合(ほとんどのプラットフォームでは、すべてのビットフィールドが型と一致するため、この場合はこれで十分です)、移植可能です

C ++ 11タイプの使用(代わりに、プラットフォームに適したタイプのライブラリを使用できます):

union {
   struct {
      uint16_t  _1;
      uint8_t   _2;
      uint8_t   _3;
   } field;
   uint32_t value;
};
// ...
于 2012-08-25T02:04:53.213 に答える
0

匿名のユニオンは一般的に問題ありませんが、構造には名前を付ける必要があります。これを使用して、構文から1レベルの「ドット」を切り取ることができる場合があります。

ただし、名前付き構造体メンバーを介して個別に(ビットフィールドとして)および全体として(DWORDSとして)フィールドにアクセスする必要がある場合は、構文が少し乱雑になる必要があります。この種のユースケースでは、ユニオンが必要になり、内部構造体が必要になり、問題が発生します。getter / setter関数の背後にある厄介な構文はいつでも隠すことができますが、構造が大きい場合、そのメソッドはあまり保守できません。

検討できる代替案は次のとおりです。

typedef struct
{
    // DWORD 0
    DWORD   field1   : 16;
    DWORD   field2   : 8;
    DWORD   field3   : 8;
    // DWORD 1
    DWORD   field4   : 32; 
} bitfield_struct;

これはビットフィールドレベルのアクセスのみを提供しますが、構文はよりクリーンです。ただし、必要に応じて、DWORDレベルのデータに引き続きアクセスできます。

bitfield_struct foo;
DWORD* bar = (DWORD*)&foo;

bar[0] = ...;
bar[1] = ...;

通常、ビットフィールドを介してデータにアクセスし、DWORDでアクセスすることはめったにない場合、これは許容できるソリューションである可能性があります。

于 2012-08-25T00:44:28.707 に答える