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 に答える