###
16 不完全型

不完全型はメンバーがまだ指定されていない構造体、共用体もしくは配列です。 Cでは、前方宣言により指定され、後で定義されます:

    struct cell; /* 前方宣言 */

    struct {
        char *name;
        struct cell *next;
    } cell;

ctypesコードへの直接的な変換ではこうなるでしょう。 しかし、動作しません:

    >>> class cell(Structure):
    ...     _fields_ = [("name", c_char_p),
    ...                 ("next", POINTER(cell))]
    ...
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "<stdin>", line 2, in cell
    NameError: name 'cell' is not defined
    >>>

なぜなら、新しい`class cell`はクラス文自体の中では利用できないからです。 `ctypes`では、`cell`クラスを定義して、`_fields_`属性を クラス文の後で設定することができます:

    >>> from ctypes import *
    >>> class cell(Structure):
    ...     pass
    ...
    >>> cell._fields_ = [("name", c_char_p),
    ...                  ("next", POINTER(cell))]
    >>>

試してみましょう。`cell`のインスタンスを二つ作り、互いに参照し合うように します。最後に、つながったポインタを何度かたどります:

    >>> c1 = cell()
    >>> c1.name = "foo"
    >>> c2 = cell()
    >>> c2.name = "bar"
    >>> c1.next = pointer(c2)
    >>> c2.next = pointer(c1)
    >>> p = c1
    >>> for i in range(8):
    ...     print p.name,
    ...     p = p.next[0]
    ...
    foo bar foo bar foo bar foo bar
    >>>