2012-11-28 72 views
1

如何从C中使用SWIG访问Python中的静态函数?例如:在Python中访问静态C函数

static int foo(int a, int b); 

C代码无法更改。

+1

我很困惑这将如何工作 - 如果一个函数在C中是静态的,它不能在同一个C程序中的另一个翻译单元中被访问。唯一可能的方法是如果函数定义在某个头文件中。 – Flexo

回答

1

这真的是唯一可行的办法是,如果任一

  1. 你必须声明和定义一个头文件里面
  2. 你得到一个函数指针
  3. 有些疯疯两轮牛车的方式
  4. 你有整个程序的来源

对于#1我把一个例子hea der文件我们可能正在处理:

#ifndef TEST_H 
#define TEST_H 

#include <stdio.h> 

static int foo(int a, int b) { 
    return printf("Frobination: %d-%d\n",a,b); 
} 

#endif 

虽然在头文件里面做这件事有点奇怪,但并非不可能。在这种情况下,我们可以把它包装成正常使用:

%module test 

%{ 
#include "test.h" 
%} 

%include "test.h" 

并运行它为:需要提醒的是这是当然的静态函数的本地版本,在这里被使用,就像

Python 2.7.3 (default, Aug 1 2012, 05:16:07) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import test 
>>> test.foo(1,2) 
Frobination: 1-2 
17 
>>> 

正常情况下有多个翻译单元和静态函数。

#2,我们可能有头文件:

#ifndef TEST_H 
#define TEST_H 

typedef int (*fptr)(int a, int b); 

extern fptr foo; 

#endif 

和,作为一个执行:

%module test 

%{ 
#include "test.h" 
%} 

int foo(int a, int b); 

其中:

#include "test.h" 
#include <stdio.h> 

static int foo_impl(int a, int b) { 
    return printf("Frobination: %d-%d\n",a,b); 
} 

fptr foo = foo_impl; 

然后我们可以用包我们向SWIG撒谎并声称foo不是函数指针,但它起作用并且完全合法,因为所有的ge星号代码有效。

对于#3,我们可以在理论上,通过各种平台特定的非便携挂羊头卖狗肉提取静态函数住在成函数指针的地址,但那是脆弱的,全方位的一个坏主意。

对于#4,如果你有可用的源,然后你回家免费。