2011-10-28 9 views
2

.mm拡張子なしでobjective-cコードからC++関数を呼び出す方法はありますか? たとえば、このような状況で役立つCラッパーなどを作成することは可能でしょうか? .mファイルに "objective-C++ source"という型を割り当てることは可能ですが、それは私が望むものではありません。.mm拡張子なしでobjective-cコードからC++関数を呼び出す方法はありますか?

+1

ファイルの作成にはどのような問題がありますか?シンプルで標準的な方法です –

+0

もう少し情報を提供できますか?方法はありますが、具体的なシナリオが役立つことがわかっています。 – mkb

答えて

5

はい、これは頻繁に行います。少量の.mmグルーコードが必要ですが、あなたのラッパー使用の直感は正しいです。あなたはWrapping C++ - Take 2に興味があるかもしれません。

.mmファイルを過剰に使用しないようにする理由があります。コンパイルは遅く、遅く実行されます(特にARCではかなりのオーバーヘッドが発生します)、gdbを自分の経験に混同し、ObjCとC++クラスの混在はかなり混乱し、エラーが発生しやすくなります。 ObjCとC++をそれらの間の薄いレイヤーでセグメンテーションするのは良いアプローチです。

+1

「もっとゆっくり走れますか? Objective-C++でコンパイルしたときにC++オブジェクトがARCの対象になるとは思わなかった。 – IronMensan

1

Objective-C++を使用することは間違いありませんが、何らかの理由で*使用できない場合はCラッパーを使用できますが、純粋にCでなければなりません。 :私はSOMをやったので、必要ではない可能性があります別のimpl*の機能を有する

//MyClass.h 

class MyClass { 
public: 
    MyClass() : myInt(10) {} 
    ~MyClass() {} 
    int GetMyInt() const {return myInt;} 

private: 
    int myInt; 
} 

//MyClassWrap.h 

#ifdef __cplusplus 
extern "C" { 
#endif 

typedef struct {void * myClass} MyClassWrap; 

MyClassWrap CreateMyClass(); 
void DestroyMyClass(MyClassWrap myClass); 
int GetMyInt(MyClassWrap myClass); 

#ifdef __cplusplus 
} 
#endif 

//MyClassWrap.cpp 

#include "MyClassWrap.h" 
#include "MyClass.h" 

static void * implCreate() 
{ 
    return static_cast<void *>(new MyClass()); 
} 

static void implDestroy(void * myClass) 
{ 
    delete static_cast<MyClass *>(myClass); 
} 

static int implGetMyInt(void * myClass) 
{ 
    return static_cast<MyClass *>(myClass)->GetMyInt(); 
} 

extern "C" { 

MyClassWrap CreateMyClass() { 
    MyClassWrap wrap; 
    wrap.myClass=implCreate(); 
    return wrap; 
} 

void DestroyMyClass(MyClassWrap myClass) { 
implDestroy(myClass.myClass); 
} 

int GetMyInt(MyClassWrap myClass) { 
    return implGetMyInt(myClass.myClass); 
} 

} //extern "C" 

、それはしばらくしていますこのようなもの。このアプローチでは、Objective-CファイルにMyClassWrap.hを含めることができ、Objective-C++としてコンパイルされたファイルがないC++関数に間接的にアクセスできます。

*コード内にclassという名前の変数が多すぎる可能性があります。

関連する問題