【发布时间】:2019-07-01 15:44:07
【问题描述】:
我想包装下面的 C 函数。注意,从 Foo_t * 到 Bar_t * 的类型转换:
void function(Foo_t * f) {
Bar_t * b = (Bar_t *) f; // casting is done in C original code
//do sth with b
}
Swig 生成一个遵循此模式的包装器:
void wrap_function( Foo_t *foo ) {
function(foo);
}
但在 python 中,我想使用 Bar_t 实例调用我的包装函数:
b = Bar_t()
function(b)
所以,我开始了以下类型映射:
%typemap(in) Foo * {
Bar_t *temp;
int res0 = 0;
Foo_t *arg = 0;
res0 = SWIG_ConvertPtr($input, (void **) &temp, $descriptor(Bar_t *), 0|0);
if (!SWIG_IsOK(res0)) {
SWIG_exception_fail(SWIG_ArgError(res0), "in method '" "function" "', argument " "1"" of type '" "Bar_t *""'");
}
$1 = (Foo_t *) temp;
function(arg);
}
但是抛出异常!
如何从 Bar_t * 转换为 Foo_t * ?
【问题讨论】:
-
通过不同类型的指针访问是未定义的行为。如果需要继承,请使用 C++。
-
如果 Foo * 和 Bar * 的对齐要求相同,我应该得到原始指针。我无法修改 C 代码端。