如何更改SWIG生成的默认代码以分配C结构的内存?

时间:2017-02-12 17:37:53

标签: swig

我在结构中使用灵活的数组。所以我想用一些自己的代码更改为该结构分配的内存。基本上我想更改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()以便为灵活数组分配内存。那么有什么方法可以解决这个问题吗?

1 个答案:

答案 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函数。

我还假设您要将结构内部的长度记录为其成员之一。如果情况并非如此,您只需删除我所做的任务即可。