2011-10-07 13 views
13

私は自分のライブラリのプロトタイプツールとしてPure Dataを使いたいと思っています。 Pure DataのパッチはC言語で書かれていますが、私のライブラリはC++で書かれています。どうすれば純粋なデータでこのコードを使用できますか?私はプレーンCを使用していないので、私はC++クラスのCラッパーをどのように書くことができるのか、クラスをインスタンス化する方法を知りたいのですが?あるいは、Cですべてを書き直さなければならないのですか?Cラッパーfor C++

+5

少し遅れましたが、私はC++のCラッパーに関する小さなハウツーを書いています:http://www.teddy.ch/c++_library_in_c/ – Teddy

答えて

21

あなたが呼ばれる必要があるすべての関数のラッパー関数を記述する必要があります。たとえば:!。

// 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); 

ノートTHI sはC++コードでなければなりません。 extern "C"は、関数がCの命名規則を使用するように指定しています。

+6

'void *'を使用するのではなく、不完全な構造体を使用して型の安全性を得るべきです。 –

+1

理解しやすくするために、 'extern" Linkage_Specification "{// code}"このようにして、コードをリンクする際に使用するリンケージ仕様をコンパイラに指示します。 –

+0

あなたの例を完全に理解しているかどうかはわかりません。 C++ヘッダのextern "C"関数を宣言すると、なぜC言語で宣言しなければならないのですか?私はCファイルにC++ヘッダーを含めて関数を直接呼び出すことはできませんか? – Pedro

1

あなたはC++からCを絶対に呼び出すことができます - 問題ありません!

Pure Dataから呼び出す関数を「extern C」として明示的に宣言しなければならない場合があります。しかし、それは純粋なデータがすでにあなたはおそらく純粋なデータのヘッダファイルに「のextern C」が表示されます(あなたのためにそれを行っていることはほぼ確実だ

ここ

は、より多くの情報です:「希望

http://msdn.microsoft.com/en-us/library/0603949d%28v=vs.80%29.aspx

こと助け

+0

私はQからOPがC++をCから呼び出すと思っています。他の方法ラウンド。 –

+0

私はそれを他の方法で使いたい:C++をcから呼び出す。 – Pedro

+0

おそらくPure Dataは、それが何であれ、Cについてしか知りません。 –

2

私はそれを別の方法で入れてみましょう:CはC++ソースに呼び出すたび)あなたがC++ソースからC関数、データやライブラリを呼び出すことができ、あなたがC.

2からC++ソース呼び出す)

1ただし、そのソースはC++のCサブセットで記述する必要があります。

3)この部分は「extern C」を使用しています。

4)他の部分は、私は先に引用したリンクが詳細

6の多くを与える) "の#ifdef __cplusplus"

5を使用して)私はPure Data site見ました。あなたのライブラリにいくつかの "調整"をしなければならないかもしれません。新しいヘッダーを作成することもできます。しかし基本的には、あなたのライブラリを純粋なデータと統合するというあなたの目標をおそらく達成できると思います。

私見...

2

またflext frameworkを使用してC++を使用して純粋なデータのためのオブジェクトを作成することができます。