我正在尝试使用SWIG包装一种“变体”类型。我的意思是有点像GType之类的东西,您所获得的指针是基本类型,但实际类型实际上更大,可以使用基本类型的字段来找到它。
#define OBJ_TYPE_1 1
#define OBJ_TYPE_2 2
typedef struct Base_t {
DWORD mObjectSize;
DWORD mObjectType;
} Base;
typedef struct Object1_t {
Base mBase;
DWORD member1;
DWORD member2;
// Some specific members...
} Object1;
typedef struct Object2_t {
Base mBase;
DWORD member3;
DWORD member4;
WORD member5;
// Some different specific members ...
} Object2;
建议的C接口使用库的方式类似于以下内容
Base base;
// Get object header to find out type
PeekObject(&base);
// Treat object depending on type
if (base.mObjectType == OBJ_TYPE_1) {
Object1* obj = (Object1*) malloc(sizeof(Object1));
ReadObject(&(obj->mBase));
DWORD blahblah = obj->member2;
}
else if (base.mObjectType == OBJ_TYPE_2) {
// ...
}
您如何将其包装在SWIG中?理想情况下,在Python中,您只需“ ReadObject” 即可直接接收正确类型的对象。
>>> obj = lib.read_object()
>>> obj
<class 'lib.Object1'>
我不能更改库,但是可以修改包装(.i文件)。我应该使用自定义代码吗?我应该使用类型映射吗?我不知道为什么,我记得SWIG文档中有专门针对此的示例,但是我无法再次找到它……