SWIGを使用してCからPythonの静的関数にアクセスするにはどうすればよいですか? 例えば:
static int foo(int a, int b);
C コードは変更できません。
これが実際に可能な唯一の方法は、
#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については、ソースが利用可能であれば、家から解放されます。