在ctypes中子类化c_void_p是否可行?

3 投票
1 回答
1425 浏览
提问于 2025-04-16 12:00

我正在使用一个库,这个库返回的是不透明指针。请问,能不能通过继承 c_void_p 来在 ctypes 中表示这个指针,并为这种特定类型的 c_void_p 提供类型检查呢?

1 个回答

2

一种简单的方法来进行这种类型检查,就是创建一个任意的 ctypes.Structure

class _Opaque(ctypes.Structure):
    pass

然后,把相关函数的返回类型声明为指向这个结构的指针。

lib.f.restype = ctypes.POINTER(_Opaque)

同时,也要把接受这种指针的函数的参数类型声明为这个指针:

lib.g.argtypes = [ctypes.POINTER(_Opaque)]

现在,ctypes 确保传给 g 的参数是之前由 f 返回的指针。(注意,我在 _Opaque 前面加了一个 _,这是为了在这个模块中专用的标记。)

撰写回答