1. ホーム
  2. c++

[解決済み] C 言語の構造体における ":" (コロン) - その意味は? 重複] [重複] [重複

2022-07-28 08:09:29

質問

struct _USBCHECK_FLAGS
    {
        unsigned char   DEVICE_DEFAULT_STATE       : 1;
        unsigned char   DEVICE_ADDRESS_STATE       : 1;
        unsigned char   DEVICE_CONFIGURATION_STATE : 1;
        unsigned char   DEVICE_INTERFACE_STATE     : 1;
        unsigned char   FOUR_RESERVED_BITS         : 8;
        unsigned char   RESET_BITS                 : 8;
    } State_bits;

は何をするのか :1:8 の意味は?

どのように解決するのですか?

これらはビットフィールドです。基本的には、コロンの後の数字が、そのフィールドが何ビット使っているかを表しています。以下は からの引用です。 からの引用です。

定数式は、フィールドの幅をビット単位で指定します。宣言子の 宣言子の型指定子はunsigned int、signed int、またはintでなければなりません。 intでなければならず、定数式は非負の整数値でなければなりません。 値が0である場合、宣言は宣言子を持ちません。ビットフィールドの配列 の配列、ビットフィールドへのポインタ、およびビットフィールドを返す関数は使用できません。 は許されません。オプションの宣言子は、ビットフィールドの名前を指定します。ビットフィールド は、構造体の一部としてのみ宣言することができます。ビットフィールドにAddress-of演算子 (&) は、ビットフィールドの構成要素には適用できません。

無名のビットフィールドは参照できず、実行時の内容は予測不可能です。 は予測不可能です。それらは、整列のために、"ダミー"フィールドとして使用することができます。 として使用することができます。幅が0と指定された無名ビットフィールドは、その後に続くメンバのストレージを保証します。 でそれに続くメンバの格納が保証されます。 struct-declaration-listのそれに続くメンバーのストレージがint境界で始まることを保証します。

この例では、screenという名前の構造体の2次元配列を定義しています。

struct 
{
    unsigned short icon : 8;
    unsigned short color : 4;
    unsigned short underline : 1;
    unsigned short blink : 1;
} screen[25][80];

編集: MSDN のリンクからもう一つ重要なことを。

ビットフィールドはinteger型と同じセマンティクスを持ちます。つまり と同じように式で使用されます。 と全く同じ方法で使用されます。 と同じように使われます。

簡単なサンプルで、これをうまく説明しています。興味深いことに、型が混在している場合、コンパイラはデフォルトで sizeof (int) .

  struct
  {
    int a : 4;
    int b : 13;
    int c : 1;
  } test1;

  struct
  {
    short a : 4;
    short b : 3;
  } test2;

  struct
  {
    char a : 4;
    char b : 3;
  } test3;

  struct
  {
    char a : 4;
    short b : 3;
  } test4;

  printf("test1: %d\ntest2: %d\ntest3: %d\ntest4: %d\n", sizeof(test1), sizeof(test2), sizeof(test3), sizeof(test4));

test1: 4

テスト2: 2

テスト3: 1

テスト4: 4