1

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

static int foo(int a, int b);

C 代码不能更改。

4

1 回答 1

1

唯一可行的方法是,如果

  1. 您在头文件中有声明和定义
  2. 你有办法得到一个函数指针
  3. 一些疯狂的疯狂黑客
  4. 你有可用的整个程序的来源

对于#1,我整理了一个我们可能正在使用的示例头文件:

#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

并将其实现为:

#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;

然后我们可以用它来包装:

%module test

%{
#include "test.h"
%}

int foo(int a, int b);

我们对 SWIG 撒谎并声称 foo 不是函数指针,但它可以工作并且完全合法,因为所有生成的代码都是有效的。

对于#3,我们理论上可以通过各种特定于平台的非便携式诡计将静态函数所在的地址提取到函数指针中,但这很脆弱,而且是个坏主意。

对于#4,如果您有可用的资源,那么您就可以免费回家了。

于 2012-11-28T15:05:20.097 回答