我正在尝试为一个在结构体中使用函数指针的C库写一个SWIG Package 器。我不知道如何处理包含函数指针的结构体。下面是一个简化的例子。
测试i:
/* test.i */
%module test
%{
typedef struct {
int (*my_func)(int);
} test_struct;
int add1(int n) { return n+1; }
test_struct *init_test()
{
test_struct *t = (test_struct*) malloc(sizeof(test_struct));
t->my_func = add1;
}
%}
typedef struct {
int (*my_func)(int);
} test_struct;
extern test_struct *init_test();
字符串
示例会话:
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> t = test.init_test()
>>> t
<test.test_struct; proxy of <Swig Object of type 'test_struct *' at 0xa1cafd0> >
>>> t.my_func
<Swig Object of type 'int (*)(int)' at 0xb8009810>
>>> t.my_func(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'PySwigObject' object is not callable
型
有谁知道是否可以让**t.my_func(1)**返回2?
谢谢你,谢谢
3条答案
按热度按时间3okqufwl1#
我找到了一个答案。如果我将函数指针声明为SWIG“成员函数”,它似乎会像预期的那样工作:
字符串
工作阶段:
型
我希望有一些东西不需要编写任何定制的SWIG特定的代码(我更喜欢只“%include”我的头而不修改),但我想这就可以了。
stszievb2#
在init_test()中忘记“return t;”:
字符串
pxy2qtax3#
目前有一项工作已经取得了令人满意的结果,即将从C代码中获得C绑定。
所以最简单的方法
1.创建C代码而不是C。
1.克隆这个未合并的分支https://github.com/swig/swig/pull/2086并从源代码编译。
1.创建python绑定。
然后你可以使用
-c
选项来提供C和Python的绑定。然后你的代码将在C和Python中可用。