###
8 標準データ型

クラス `Union`( | *args, **kw)

  ネイティブのバイトオーダーでの共用体のための抽象ベースクラス。

クラス `BigEndianStructure`( | *args, **kw)

  ビックエンディアンバイトオーダーでの構造体のための抽象ベースクラス。

クラス `LittleEndianStructure`( | *args, **kw)

  リトルエンディアンバイトオーダーでの構造体のための抽象ベースクラス。

ネイティブではないバイトオーダーを持つ構造体にポインタ型フィールドあるいは ポインタ型フィールドを含む他のどんなデータ型をも入れることはできません。

クラス `Structure`( | *args, **kw)

  ネイティブのバイトオーダーでの構造体のための抽象ベースクラス。

具象構造体型と具象共用体型はこれらの型の一つをサブクラス化することで 作らなければなりません。少なくとも、`_fields_`クラス変数を 定義する必要があります。`ctypes`は、属性に直接アクセスしてフィールドを 読み書きできるようにする記述子を作成するでしょう。これらは、

`_fields_`
  構造体のフィールドを定義するシーケンス。要素は2要素タプルか3要素タプルで なければなりません。第一要素はフィールドの名前です。 第二要素はフィールドの型を指定します。それはどんなctypesデータ型でも 構いません。

  `c_int`のような整数型のために、オプションの第三要素を 与えることができます。フィールドのビット幅を定義する 正の小整数である必要があります。

  一つの構造体と共用体の中で、フィールド名はただ一つである必要があります。 これはチェックされません。名前が繰り返しでてきたときにアクセスできるのは 一つのフィールドだけです。

  Structureサブクラスを定義するクラス文の後で、 `_fields_`クラス変数を定義することができます。 これにより自身を直接または間接的に参照するデータ型を 作成できるようになります:

      class List(Structure):
          pass
      List._fields_ = [("pnext", POINTER(List)),
                       ...
                      ]

  しかし、`_fields_`クラス変数はその型が最初に使われる (インスタンスが作成される、それに対して`sizeof()`が呼び出されるなど)より前に 定義されていなければなりません。その後`_fields_`クラス変数へ代入すると AttributeErrorが発生します。

  構造体および共用体サブクラスは位置引数と名前付き引数の両方を受け取ります。 位置引数は`_fields_`定義中に現れたのと同じ順番で フィールドを初期化するために使われ、 名前付き引数は対応する名前を使ってフィールドを初期化するために 使われます。

  構造体型のサブクラスを定義することができ、もしあるならサブクラス内で 定義された`_fields_`に加えて、ベースクラスのフィールドも 継承します。

`_pack_`
  インスタンスの構造体フィールドのアライメントを上書きできるようにする オブションの小整数。`_pack_`は`_fields_`が 代入されたときすでに定義されていなければならない。そうでなければ、 何ら影響はありません。

`_anonymous_`
  無名(匿名)フィールドの名前が並べあげられたオプションのシーケンス。 `_fields_`が代入されたとき、`_anonymous_`がすでに 定義されていなければならない。そうでなければ、何ら影響はありません。

  この変数に並べあげられたフィールドは構造体型もしくは共用体型フィールドで ある必要があります。構造体フィールドまたは共用体フィールドを作る必要なく、 入れ子になったフィールドに直接アクセスできるようにするために、 `ctypes`は構造体型の中に記述子を作成します。

  型の例です(Windows):

      class _U(Union):
          _fields_ = [("lptdesc", POINTER(TYPEDESC)),
                      ("lpadesc", POINTER(ARRAYDESC)),
                      ("hreftype", HREFTYPE)]

      class TYPEDESC(Structure):
          _fields_ = [("u", _U),
                      ("vt", VARTYPE)]

          _anonymous_ = ("u",)

  `TYPEDESC`構造体はCOMデータ型を表現しており、`vt`フィールドは 共用体フィールドのどれが有効であるかを指定します。`u`フィールドは 匿名フィールドとして定義されているため、TYPEDESCインスタンスから取り除かれて そのメンバーへ直接アクセスできます。 `td.lptdesc`と`td.u.lptdesc`は同等ですが、前者がより高速です。 なぜなら一時的な共用体インスタンスを作る必要がないためです:

      td = TYPEDESC()
      td.vt = VT_PTR
      td.lptdesc = POINTER(some_type)
      td.u.lptdesc = POINTER(some_type)

構造体のサブ-サブクラスを定義することができ、ベースクラスのフィールドを 継承します。サブクラス定義に別の`_fields_`変数がある場合は、 この中で指定されたフィールドはベースクラスのフィールドへ追加されます。

構造体と共用体のコンストラクタは位置引数とキーワード引数の両方を受け取ります。 位置引数は`_fields_`の中に現れたのと同じ順番でメンバーフィールドを 初期化するために使われます。コンストラクタのキーワード引数は属性代入として解釈され、 そのため、同じ名前をもつ`_fields_`を初期化するか、 `_fields_`に存在しない名前に対しては新しい属性を作ります。