Pythonインタプリタ自体がC言語で記述されているため、Cコードと同じ呼び出し規約を使用するため、呼び出し規約はPythonからC言語を呼び出すときには問題になりません。
異なるコンパイル言語(CやAdaなど)で記述されたコードを組み合わせると問題になります。
通常、Cはシステムプログラミング言語であり、したがって標準です。これは、任意の言語のコンパイラが、Cと相互運用するための特殊なサポートを一般に持つことを意味します。CとAdaの相互運用性の例については、hereを参照してください。特別なサポートがない場合、ラッパーはアセンブリレベルで記述する必要があります。
PythonからC++/Adaを呼び出す必要がある場合は、2つの手順に従わなければなりません。最初のステップは、C++/Ada関数のまわりにCラッパーを書くことです。 2番目のステップは、PythonからCラッパーを呼び出すことです。
たとえば、次のC++クラスを取ります。
class Foo
{
public:
Foo();
int bar();
...
};
あなたはパイソンが利用できるようにしたい場合は、まずCでそれをラップする必要があります。
extern "C" {
typedef void *FooPtr;
FooPtr foo_new() { return (FooPtr)new Foo(); }
int foo_bar (FooPtr foo) { return ((Foo*)foo)->bar(); }
...
}
次に、あなたのpythonからのことを呼び出すことができます。 (実際には、Boost.Pythonのように、これを自動化するツールがあります。
ラッパーの記述には、呼び出し規約の変換と型表現間の変換という2つの側面があります。後の部分は通常、最も基本的なタイプの言語を超えてすぐに同等のタイプの表現が非常に異なる傾向があるため、最も困難です。
あなたは、PythonからC++の関数を呼び出すために使用しているどのようなユーティリティ? – Lalaland
@EthanSteinberg、おそらくctypes。 – Alcott