swig-c/c++与高级脚本语言之间的胶水工具

28 篇文章 0 订阅

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**的表示方法显而易见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值