[解決済み] オブジェクト指向C++コードのC言語ラッパーAPIの開発
質問
オブジェクト指向の C++ で書かれた)コアロジックにアクセスするために、既存の C++ API をラップする一連の C API を開発したいと考えています。これは本質的に、私たちの C++ ロジックを他の言語から使用できるようにするための接着剤 API になります。オブジェクト指向C++の周りにCをラップすることに関係する概念を紹介する、良いチュートリアル、書籍、またはベストプラクティスは何ですか?
どのように解決するのですか?
これは手作業で行うのはそれほど難しくありませんが、インターフェイスのサイズに依存します。 私がこれを行ったケースは、純粋な C コード内から C++ ライブラリを使用できるようにするためであり、したがって SWIG はあまり役に立ちませんでした。(SWIG はこれを行うために使用できるかもしれませんが、私は SWIG の第一人者ではなく、それは自明ではないように思えました)。
結局、私たちが行ったのは
- すべてのオブジェクトは C で不透明なハンドルで渡されます。
- コンストラクタとデストラクタは純粋な関数でラップされています。
- メンバ関数は純粋関数である。
- 他の組み込み関数は、可能な限り C の同等品にマップされます。
つまり、このようなクラス(C++のヘッダ)です。
class MyClass
{
public:
explicit MyClass( std::string & s );
~MyClass();
int doSomething( int j );
}
このようにCのインタフェースにマッピングされます(Cヘッダ)。
struct HMyClass; // An opaque type that we'll use as a handle
typedef struct HMyClass HMyClass;
HMyClass * myStruct_create( const char * s );
void myStruct_destroy( HMyClass * v );
int myStruct_doSomething( HMyClass * v, int i );
インターフェースの実装は次のようになります(C++のソース)。
#include "MyClass.h"
extern "C"
{
HMyClass * myStruct_create( const char * s )
{
return reinterpret_cast<HMyClass*>( new MyClass( s ) );
}
void myStruct_destroy( HMyClass * v )
{
delete reinterpret_cast<MyClass*>(v);
}
int myStruct_doSomething( HMyClass * v, int i )
{
return reinterpret_cast<MyClass*>(v)->doSomething(i);
}
}
キャストを必要としないように、元のクラスから不透明なハンドルを導出し (これは私の現在のコンパイラではうまくいかなかったようです)。C はクラスをサポートしないので、ハンドルを構造体にする必要があります。
これで基本的なCのインターフェイスができました。もし、例外処理を統合する一つの方法を示すより完全な例が必要なら、githubにある私のコードを試してみてください。 https://gist.github.com/mikeando/5394166
面白いのは、必要な C++ ライブラリをすべて、より大きなライブラリに正しくリンクさせることです。gcc (または clang) の場合、これは g++ を使用して最終的なリンク段階を行うことを意味します。
関連
-
[解決済み】coutはstdのメンバではない
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] C++とCの融合 - #ifdef __cplusplus はどのように機能するのか?
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み】C++でファクトリーメソッドパターンを正しく実装する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み] GoでC++を使うには
-
[解決済み] node.jsからC++のライブラリを使用するにはどうすればよいですか?
-
[解決済み] SwiftからC++のクラスとインタラクトする