2012-01-24 9 views
4

私はC++とCの結合されたAPIであると思われるもののためのヘッダーファイルを持っています。 Cの部分はextern "C"にラップされていますが、宣言自体はCとは大きく異なります。たとえば:C APIへのC++参照のラップ

foo::Bar& Foo_Baz_GetBarOfQux(void *_self, const foo::Qux &qux); 

実際にプレーンCを使用する方法はありますか。私は明らかに、このヘッダを使用することはできませんが、多分私は何とかそれを再宣言することができます

/* type? */ Foo_Baz_GetBarOfQux(void*, const /* type? */); 

は何を私に困惑して(それが可能だ場合)これらの参考文献の種類を宣言する方法です。

P.S.私はこの上に自分自身のCラッパーを書くことができます知っている:私は不透明な構造体としてのクラスを宣言します。その後、

typedef struct foo_bar foo_bar_t; 
typedef struct foo_baz foo_baz_t; 
typedef struct foo_qux foo_qux_t; 

と上記の関数をラップC-のような関数を書く:

extern "C" 
foo_bar_t* 
foo_baz_get_bar_of_qux(
    foo_baz_t* baz, 
    foo_qux_t* qux) 
{ 
    return (foo_bar_t*) Foo_Baz_GetBarOfQux(baz, *(foo::Qux*)qux); 
} 

しかし、元のFoo_Baz_GetBarOfQux()を直接使用できるかどうかは疑問です。

+0

AFAIKあなたはCでスコープ解決演算子 '::'を持っていないし、 'Bar&'のような参照を返すこともできないので、この関数をplain Cのように使うことはできない。 –

+0

@ another.anon.cowardそうだが、それ? (質問を更新しました。) –

+0

私は、foo :: Barとfoo :: Quxと同じメモリレイアウトを持つCの型(structs?)を定義すると可能でしょう。 – Alex

答えて

7

あなたがc++で、直接メンバ関数への呼び出しをFoo_Baz_GetBar()を使用することはできません何が暗黙のうちにあなたのcコードに存在しないthisポインタを渡す必要はありません。

+1

まあ、それは私のせいだ。私は単純な例を準備しようとし、そのポインタを失った。私はその質問を修正している。 –

2

一般に、不透明な構造を使用する方がよいでしょう。

コードの "C"インタフェースでは、不透明な構造体内での呼び出しを試みることはなく、ポインタを丁寧に渡すだけです。

"C++"の部分では、構造体を定義し、実際にそれらを適切に埋め込む必要があります(ブラインド型キャストは避けてください)。

「C++」の部分は、Cコンパイラと混同しないように、「C」ヘッダーに公開しないでください。

+0

はい、これは唯一の選択肢のようです。私は実際にC++側でデータを書き込むことができません。ヘッダとC++の「クラス」は、実際に同じ 'Foo_Baz_GetBarOfQux()'やCリンケージを持つ同様の関数を呼び出すいくつかのインライン「メソッド」を宣言しているからです。タイプ。今のところ、キャスト参照のイディオム '' *(foo :: Qux *)qux''はうまくいきました。 –