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集成的目标。

恕我直言...