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...