自分のライブラリのプロトタイピング ツールとして Pure Data を使用したいと考えています。Pure Data のパッチは C で書かれているのに、私のライブラリは C++ で書かれていることがわかりました。では、このコードを純粋なデータで使用するにはどうすればよいでしょうか? プレーン C を使用したことがないので、C++ クラスの C ラッパーを作成する方法と、クラスをインスタンス化する方法を知りたいです。それとも、すべてを C で書き直す必要がありますか?
4 に答える
呼び出す必要がある関数ごとにラッパー関数を記述する必要があります。例えば:
// The C++ implementation
class SomeObj { void func(int); };
extern "C" {
SomeObj* newSomeObj() {return new SomeObj();}
void freeSomeObj(SomeObj* obj) {delete obj;}
void SomeObj_func(SomeObj* obj, int param) {obj->func(param)}
}
// The C interface
typedef struct SomeObjHandle SomeObj;
SomeObj* newSomeObj();
void freeSomeObj(SomeObj* obj);
void SomeObj_func(SomeObj* obj, int param);
これは C++ コードでなければならないことに注意してください。はextern "C"
、関数が C 命名規則を使用することを指定します。
flext フレームワークを使用して、C++ を使用して Pure Data のオブジェクトを作成することもできます。
別の言い方をしましょう:
1) C++ ソースから C 関数、データ、およびライブラリを呼び出すことができ、C から C++ ソースを呼び出すことができます。
2) ただし、C が C++ ソースを呼び出す場合は常に、そのソースを C++ の C サブセットで記述する必要があります。
3)これの一部は「extern C」を使用しています。
4) 別の部分は「#ifdef __cplusplus」を使用しています
5)上で引用したリンクは、多くの詳細を提供します
6) Pure Data のサイトを見ました。ライブラリにいくつかの「調整」を加える必要がある場合があります。新しいヘッダーを作成したい場合があります。しかし基本的には、ライブラリを Pure Data と統合するという目標をおそらく達成できると思います。
私見では...
C++ から C を完全に呼び出すことができます - 問題ありません!
最悪の場合、Pure Data から呼び出す関数を「extern C」として明示的に宣言する必要がある場合があります。しかし、Pure Data がすでにそれを行っていることはほぼ確実です (おそらく、Pure Data ヘッダー ファイルに「extern C」が表示されます。
詳細は次のとおりです。
http://msdn.microsoft.com/en-us/library/0603949d%28v=vs.80%29.aspx
「お役に立てば幸いです!