14.14.1.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
>>>

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。