我正在尝试为C库编写SWIG包装器,该包装器使用指向其结构中函数的指针。我不知道如何处理包含函数指针的结构。下面是一个简化的示例。
test.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吗?
谢谢!
我找到了答案。如果我将函数指针声明为SWIG“成员函数”,则它似乎可以按预期工作:
%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; return t; } %} typedef struct { int my_func(int); } test_struct; extern test_struct *init_test();
会议:
$ python 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.my_func(1) 2
我希望不需要编写任何特定于SWIG的自定义代码(我希望仅在不进行任何修改的情况下仅“%include”我的标头)进行编写,但是我想这可以做到。