1. 程式人生 > >swig-c/c++與高階指令碼語言之間的膠水工具

swig-c/c++與高階指令碼語言之間的膠水工具

SWIG是c/c++與高階指令碼語言之間的膠水工具。

http://www.swig.org/

一個簡單的例子

http://www.swig.org/tutorial.html

c語言程式碼

 /* File : example.c */
 
 #include <time.h>
 double My_variable = 3.0;
 
 int fact(int n) {
     if (n <= 1) return 1;
     else return n*fact(n-1);
 }
 
 int my_mod(int x, int y) {
     return (x%y);
 }
 	
 char *get_time()
 {
     time_t ltime;
     time(<ime);
     return ctime(<ime);
 }

介面檔案

 /* example.i */
 %module example
 %{
 /* Put header files here or function declarations like below */
 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();
 %}
 
 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();

生成Python模組

 unix % swig -python example.i
 unix % gcc -c example.c example_wrap.c -I/usr/local/include/python2.1
 unix % ld -shared example.o example_wrap.o -o _example.so 

驗證Python模組

 >>> import example
 >>> example.fact(5)
 120
 >>> example.my_mod(7,3)
 1
 >>> example.get_time()
 'Sun Feb 11 23:01:07 1996'

https://blog.csdn.net/tobacco5648/article/details/23999755

利用ctypes可以方便地呼叫本地的動態連結庫dll,但是C中的“指標的指標”很難表示。

如果dll中有以下函式:

  1. int test(void** p)
  2. {
  3. if(p == NULL)
  4. return -1;
  5. void* a = *p;
  6. if(a == NULL)
  7. return -2;
  8. int* b = ( int*)a;
  9. return *b;
  10. }

在python中對其進行不用的測試:

  1. test( None)
  2. return : -1
  3. -------------------------------------------
  4. a = c_void_p( None)
  5. b = pointer(a)
  6. test(b)
  7. return : -2
  8. -------------------------------------------
  9. a = c_int( 13)
  10. b = pointer(a)
  11. c = pointer(b)
  12. test(c)
  13. return : 13

則void**的表示方法顯而易見。