はC

2017-01-22 5 views
0

私はCはC

typedef struct Foo CFoo; 

#ifdef __cplusplus 
extern "C" { 
#endif 

    CFoo * CFooInit(); 
    void CFooRelease(CFoo * v); 

    void CFooMethod(CFoo * v); 
#ifdef __cplusplus 
} 
#endif 

とのcppファイル内にC.

class Foo { 
    void Method(); 
} 

に橋を公開するC++クラスを持つようにヘッダファイルを経由してC++クラスを公開、私は

を持っています
CFoo * CFooInit(){ 
    return new Foo(); 
} 
void CFooRelease(CFoo * v){ 
    delete v; 
} 

void CFooMethod(CFoo * v){ 
    v->Method(); 
} 

すべて正常ですが、コンパイル中に1つの問題/警告があります。

'Foo': type name first seen using 'struct' now seen using 'class' 

私は知っています、なぜそれがあるのですか、私はそれを修正する方法を知りません。 classstructに変更できず、Cコードにclassというキーワードを設定することはできません。私はvoid *を使うことができますが、安全ではないタイプにつながる可能性があります。

+1

これは愚かかもしれませんが、あなただけではできません: 'class Foo {...}; struct Bar:Foo {}; '次にtypedef struct Bar CFoo;'? (また 'class'を' struct'に変更できないのですか?) – melpomene

+0

@melpomeneは外部ライブラリであり、ヘッダのみを持っています。それを構造体に変更すると、どこか別のものが壊れる可能性があります(同じエラーが他の場所に現れた場合) - –

+0

解決策はコンパイラ固有のものです。どのようなコンパイラを使用しますか?私のMinGW-w64(GCC 6.2.0)の '-Wall -Wextra'はそのような警告を出します。 – HolyBlackCat

答えて

0

これはできません。 Lightnessが好んで言うように、C++には構造体はありません。クラスだけがあります。彼らは異なって表現されるかもしれません。

フリー・ファンクションextern "C"は、のクラスへのポインタを取得し、Cコードに公開します。

0

CFooInitを有するInteadはCFoo*を返し、void*を使用した。 CFooReleaseについても同様に、CFooMethodtypedef struct Foo CFooは忘れてください。

もちろん、それらの関数はvoid*Foo*の間でキャストする必要がありますが、これは異なるタイプのシステムを混在させるために支払う代金です。

何らかの形でC++型から派生したC型を持つことによって何かが得られるとは思わないという価値はありません。