.mm拡張子なしでobjective-cコードからC++関数を呼び出す方法はありますか? たとえば、このような状況で役立つCラッパーなどを作成することは可能でしょうか? .mファイルに "objective-C++ source"という型を割り当てることは可能ですが、それは私が望むものではありません。.mm拡張子なしでobjective-cコードからC++関数を呼び出す方法はありますか?
答えて
はい、これは頻繁に行います。少量の.mm
グルーコードが必要ですが、あなたのラッパー使用の直感は正しいです。あなたはWrapping C++ - Take 2に興味があるかもしれません。
.mmファイルを過剰に使用しないようにする理由があります。コンパイルは遅く、遅く実行されます(特にARCではかなりのオーバーヘッドが発生します)、gdbを自分の経験に混同し、ObjCとC++クラスの混在はかなり混乱し、エラーが発生しやすくなります。 ObjCとC++をそれらの間の薄いレイヤーでセグメンテーションするのは良いアプローチです。
「もっとゆっくり走れますか? Objective-C++でコンパイルしたときにC++オブジェクトがARCの対象になるとは思わなかった。 – IronMensan
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という名前の変数が多すぎる可能性があります。
- 1. Cコードからアセンブリ関数を呼び出す方法はありますか?
- 2. サファリ拡張からpython関数を呼び出す方法
- 3. C#からのF#タイプ拡張(静的メンバー関数)の呼び出し方法
- 4. C#から "Identify Monitors"関数を呼び出す方法はありますか?
- 5. 関数内の子関数をJavascriptの別の関数から呼び出す方法はありますか?
- 6. クロム拡張からページのjavascript関数を呼び出す方法は?
- 7. 拡張ファイルが見つからない場合は、コードから拡張ファイルを呼び出す方法はありますか?
- 8. jqGrid.info_dialogは関数ではありません。拡張を呼び出す必要はありますか?
- 9. C言語:.mm拡張子は何を表しますか?
- 10. C#でMain関数を再度呼び出す方法はありますか?
- 11. 別の拡張クラスから関数を呼び出す
- 12. php - 拡張クラスから静的関数を呼び出す
- 13. objectiveCからjavascript関数を呼び出す
- 14. DarwinとObjectiveC - Cocoaアプリケーションからシェルスクリプトを呼び出す方法は?
- 15. 拡張機能からのUIViewControllerの呼び出し関数
- 16. javascriptからbigquery API関数を呼び出す方法はありますか?
- 17. 拡張クラスの呼び出し関数
- 18. LinuxでJavaコードからC関数を呼び出すには
- 19. KotlinコードからJavascript関数を呼び出す方法は?
- 20. Google Chromeの拡張子からリモートJavaプログラムを呼び出す方法
- 21. ObjectiveCからのコールバックでC++メソッドを呼び出す
- 22. Chrome拡張機能:コンテンツスクリプトのページからjavascript関数を呼び出します。
- 23. このDLL関数をC++/Cから呼び出す方法
- 24. CからC++関数を呼び出す方法#
- 25. Javascriptからブラウザ拡張を呼び出す方法
- 26. 拡張クラスからの呼び出し
- 27. ADO/C++からMSSQLシステム関数を呼び出す方法は?
- 28. javascriptからC#関数を呼び出す方法は?
- 29. LuaスクリプトからC#関数を呼び出す方法は?
- 30. JavaのC#DLLから関数を呼び出す方法は?
ファイルの作成にはどのような問題がありますか?シンプルで標準的な方法です –
もう少し情報を提供できますか?方法はありますが、具体的なシナリオが役立つことがわかっています。 – mkb