可以是未完成对象的类型
结构体,共用体,arrays
这三种前期可以被声明但是没有被定义。
比如说C语言中的结构体,这个案例中我们先进行了声明,同样可以以这种方式声明class。然后定义实体,这种在需要相互嵌套的情况是非常有必要的。
struct cell.
struct cell{
char * name;
struct cell * next;
}
将上面这个直接翻译成为ctypes就是下面这种
>>> class cell(Structure):
... _fields_ = [("name", c_char_p),
... ("next", POINTER(cell))]
那么在这里,cell就是上面的celll,因为是直译。但是这个往往是错误的,因为next里面的cell没有定义
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in cell
NameError: name 'cell' is not defined
>>>
因为cell对象不能直接在cell内部直接引用。那么在这里面,我们可以通过先声明这个实体。
然后再定义相应的属性。
>>> 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, end=" ")
... p = p.next[0]
...
foo bar foo bar foo bar foo bar
>>>
上面是相互指向,然后通过for,形成了环的进行遍历。next[0]是进行解指针。