2011-10-07 81 views
13

我想使用Pure Data作爲我自己的庫的原型工具。我發現Pure Data補丁是用C編寫的,但我的庫是用C++編寫的。那麼我怎樣才能在純數據中使用這段代碼呢?由於我沒有使用普通的C,我想知道如何爲C++類編寫一個C封裝器,然後如何實例化我的類?還是我必須重寫C中的所有內容?C包裝C++

+5

稍微晚了一點,但我寫了一個關於C++的C封裝的小指令:http://www.teddy.ch/c++_library_in_c/ – Teddy

回答

21

你需要編寫封裝函數爲每一個需要被調用函數例如:!

// The C++ implementation 
class SomeObj { void func(int); }; 

extern "C" { 
    SomeObj* newSomeObj() {return new SomeObj();} 
    void freeSomeObj(SomeObj* obj) {delete obj;} 
    void SomeObj_func(SomeObj* obj, int param) {obj->func(param)} 
} 

// The C interface 
typedef struct SomeObjHandle SomeObj; 

SomeObj* newSomeObj(); 
void freeSomeObj(SomeObj* obj); 
void SomeObj_func(SomeObj* obj, int param); 

注THI s必須是C++代碼。 extern "C"指定該函數使用C命名約定。

+6

而不是使用'void *',你應該使用一個不完整的結構來獲得某種類型的安全。 –

+1

爲了更好地理解,'extern'Linkage_Specification「{// code}'這種方式告訴編譯器在鏈接代碼時使用Linkage規範。 –

+0

我不確定我完全理解你的例子。如果我在C++頭文件中聲明瞭這些外部「C」函數,爲什麼我必須在C中再次聲明它?我不能只在我的C文件中包含C++頭文件並直接調用函數嗎? – Pedro

1

你絕對可以從C++調用C--沒問題!

最糟糕的情況是,您可能必須將您從Pure Data調用的函數明確聲明爲「extern C」。但幾乎可以肯定的是純數據已經這樣做了你(你可能會看到「外部C」在純數據頭文件

下面是詳細信息:

http://msdn.microsoft.com/en-us/library/0603949d%28v=vs.80%29.aspx

「。希望幫助

+0

我想從Q中OP想要從C調用C++,而不是另一邊。 –

+0

我想以另一種方式使用它:從c調用C++。 – Pedro

+0

但大概是純數據,無論它是什麼,只知道C. –

2

讓我換一種說法:

1)您還可以從C++源C函數,數據和庫,你調用C從C

2 ++源)每當C調用到C++源但是,該源必須用C++的C子集編寫。

3)這部分是使用「extern C」。

4)另一部分是使用 「的#ifdef __cplusplus」

5)我上面引用的聯繫給予大量細節

6)我看着Pure Data site。您可能需要對圖書館進行一些「調整」。您可能希望創建一個新標題。但從根本上來說,我認爲你可以實現讓圖書館與Pure Data集成的目標。

恕我直言...