SWIG 學習筆記(一)

2021-06-16 14:28:46 字數 2147 閱讀 3627

swig 使用malloc() 或者 new 來給新值分配記憶體。比如如下形式的乙個變數:

char  *foo ;

swig 生成如下**:

/* c mode */

void foo_set(char *value)

/* c++ mode. when -c++ option is used */

void foo_set(char *value)

如果這不是你希望的行為,比如這是個唯讀變數,可以用

%immutable標識。或者你可以寫個自己的輔助賦值函式,比如:

%inline %

%}

注意:如果你寫了如上形式的函式,你就必須在目標語言裡呼叫這個函式來賦值(這使得它在目標語言中看上去不像個變數),比如在python 中你必須這樣寫:

>>> set_foo("hello world")

swig 這個警告資訊,通常是由c 裡的const char* 變數引起的。swig預設照樣會給該變數生成 setting 和 getting 函式,但是並不是釋放前一次的內容(結果就是可能有記憶體洩漏)。

在c/c++裡常有如下的定義:

char *version = 「1.0」;

swig預設生成的**(參見上文),swig會用free() 或 delete 釋放記憶體,這將導致保護錯。解決辦法:

將變數標記為read-only. (%immutable),  寫乙個typemap (見document 第6章),或者寫乙個特殊的set function.(如上)。另外也可以把變數定義成字元陣列:

char version[64] = "1.0";

假設有如下c標頭檔案:

/* file : vector.h */

...typedef struct vector vector;

可以通過swig的 inte***ce 讓 vector 看上去像個類。

// file : vector.i

%module mymodule

%

%include "vector.h"      // just grab original c header file%extendvector
~vector()
double magnitude() 

void print()

};

%extend指令也可以用在struct定義之內:

// file : vector.i

%module mymodule

%typedef struct vector

~vector()

...}

} vector;

%extend 指令也可以直接引用c裡的函式,只要這些函式名按照約定的命名規範:

/* file : vector.c */

/* vector methods */

#include "vector.h"

vector *new_vector(double x, double y, double z)

void delete_vector(vector *v)
double vector_magnitude(vector *v)
// file : vector.i

// inte***ce file

%module mymodule

%typedef struct vector

} vector;

swig擴充套件php(一)

同事拿c寫了個東東,php不能直接用,便問他可否寫個擴充套件,他於是提到swig,我想來慚愧,我寫過的幾個擴充套件,全部用的是php原始碼包中自帶的ext skel,於是開始學習了下swig。具體步驟 1 先寫個c檔案,example.c file example.c include double ...

swig的學習以及國密的python封裝

最近在研究國密演算法,而我們主要是使用python來進行開發,所以就需要構建乙個國密的python模組。國密演算法網上已經有很好的實現,筆者使用的是乙個參考xyssl實現的那個版本。因為這些版本都是c的,所以很容易將其擴充套件到python裡面,但是為了跟python自身的crypto的行為一致,需...

學習筆記一

lisp 最重要的一種執行模式之一 repl that endless cycle of reading,evaluating,and printing is why it s called the read eval print loop or repl.第乙個lisp程式 在repl模式下執行l...