第三方c ++库中定义的结构是:
struct CSomeStruct {
double a;
char b;
int c;
}
使用ctypes在我的cython项目中定义的相同结构是:
class PSomeStructParent(ctypes.Structure):
_fields_ = [
('a', c_double),
('b', c_char)
]
class PSomeStruct(PSomeStructParent):
_fields_ = [
('c', c_int)
]
为什么我使用继承是因为有许多类似的结构具有相同的公共字段(100或更多)。但是c ++库在各自的结构中定义了它们。 C ++和ctypes具有相同的默认包填充8.因此,如果我在c ++和cython之间传输这些结构,则内存缓冲区是不同的,无法正确转换。
sizeof(CStruct) = sizeof(double)+sizeof(char)+3+sizeof(int) = 8+1+3+4 = 16
sizeof(PStruct) = sizeof(c_double)+sizeof(c_char)+7+sizeof(int)+4 = 8+1+7+4+4=24
是否有任何方法可以处理ctypes尾部填充并可以转移到第三方库?我无法重复定义这么多领域。
答案 0 :(得分:1)
shared_fields = [
('a', ctypes.c_double),
('b', ctypes.c_char)
]
class PSomeStruct(ctypes.Structure):
_fields_ = shared_fields + [('c',ctypes.c_int)]
假设字段是由列表定义的,您可以使用Python来构建所需的列表,从而最大限度地减少重复。