2017-01-22 37 views
0

我有一個C++類,我希望暴露給C.經由頭文件揭露的C++類至C

class Foo { 
    void Method(); 
} 

橋至C

typedef struct Foo CFoo; 

#ifdef __cplusplus 
extern "C" { 
#endif 

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

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

和CPP文件,我有

CFoo * CFooInit(){ 
    return new Foo(); 
} 
void CFooRelease(CFoo * v){ 
    delete v; 
} 

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

所有工作正常,但編譯期間有一個問題/警告。

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

我知道,爲什麼它在那裏,但我不知道,如何解決它。我無法將class更改爲struct,我不能在C代碼中使用class關鍵字。我可以使用void *,但它可能導致類型不安全。

+1

這可能是愚蠢的,但你不能這樣做:'類Foo {...}; struct Bar:Foo {};'然後'typedef struct Bar CFoo;'? (另外,爲什麼你不能將'class'更改爲'struct'?) – melpomene

+0

@melpomene是一個外部庫,我只有頭文件。將其更改爲struct可能會導致其他地方出現問題(在其他地方出現相同錯誤的情況下) - –

+0

解決方案可能是特定於編譯器的。你使用什麼編譯器?我的MinGW-w64(GCC 6.2.0)和'-Wall -Wextra'發出這樣的警告。 – HolyBlackCat

回答

0

你不能那樣做。正如Lightness喜歡說的那樣,C++中沒有任何結構;只有類。他們可能會有不同的表現。

只能定義在C extern "C" free函數++一部分得到指針類和揭露那些C代碼。

0

具有CFooInit的Intead返回一個CFoo*,使用了一個void*。對於CFooReleaseCFooMethod也是如此。忘記typedef struct Foo CFoo

當然,這些功能必須在void*Foo*之間投射,但這是您爲混合不同類型系統付出的代價。

假裝有某種C類型可以從C++類型中派生出來就沒有什麼價值。