我在结构中使用灵活的数组。所以我想用一些自己的代码更改为该结构分配的内存。基本上我想更改new_structname()和structname_variable_set()函数。
typedef struct vector{
int x;
char y;
int arr[0];
} vector;
这里,SWIG生成new_vector()
函数通过调用calloc(1,sizeof(struct vector))
来分配内存,其中swig不会以特殊方式处理这些类型的结构。所以我们需要修改swig生成的new_vector()以便为灵活数组分配内存。那么有什么方法可以解决这个问题吗?
答案 0 :(得分:0)
有几种方法可以做到这一点。你正在寻找的是%extend
。这让我们可以定义新构造函数并按照我们认为合适的方式实现它们。 (它甚至可以与C编译器一起使用,它们只是从目标语言的角度来看的构造函数。)
以vector
为出发点,我们可以说明这一点:
%module test
%include <stdint.i>
%inline %{
typedef struct vector{ int x; char y; int arr[0]; }vector;
%}
%extend vector {
vector(const size_t len) {
vector *v = calloc(1, sizeof *v + len);
v->x = len;
return v;
}
}
通过此SWIG,您可以在生成的模块代码中合成new_vector
函数。
我还假设您要将结构内部的长度记录为其成员之一。如果情况并非如此,您只需删除我所做的任务即可。