C++的C封装器

20

我希望使用Pure Data作为我的库的原型工具。我发现Pure Data补丁是用C语言编写的,但我的库是用C++编写的。那么我该如何在Pure Data中使用这段代码呢?由于我没有使用过纯C,我想知道如何为C++类编写C包装器,并如何实例化我的类?还是说我必须将所有内容都重写为C语言?


7
有点晚了,但我写了一个关于C++封装C的小教程:http://www.teddy.ch/c++_library_in_c/。 - Teddy
4个回答

34
你需要为每个需要调用的函数编写包装函数。例如:
// 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);

请注意,这必须是C++代码。 extern "C"指定该函数使用C语言的命名约定。


7
为了获得一些类型安全性,您应该使用不完整的结构体来代替使用 void* - David Heffernan
1
为了更好地理解,extern "Linkage_Specification" { //code }。这样一来,我们就告诉编译器在链接代码时要使用哪种链接规范。 - Alok Save
我不确定我完全理解你的例子。如果我在我的C++头文件中声明了那些extern "C"函数,为什么我还要在C中再次声明它呢?我不能直接在我的C文件中包含C++头文件并直接调用这些函数吗? - Pedro
2
通常情况下,“extern C”与“#ifdef __cplusplus”配对使用。请参阅此链接:http://dsc.sun.com/solaris/articles/mixing.html - paulsm4
4
这个代码包装器也应该能够“吞噬异常”并将其转换为返回码。 - Matteo Italia
显示剩余3条评论

3
您可以使用flext框架使用C++编写 Pure Data 的对象。

1
让我换个方式来说:
1)您可以从C++源代码调用C函数、数据和库,也可以从C中调用C++源代码。
2)但是,每当C调用C++源代码时,该源代码必须是C++的子集。
3)其中一部分是使用“extern C”。
4)另一部分是使用“#ifdef __cplusplus”。
5)上面引用的链接提供了大量细节。
6)我查看了Pure Data网站。您可能需要对库进行一些“微调”。您可能希望创建一个新的头文件。但基本上,我认为您可以实现将库与Pure Data集成的目标。
在我看来...

0

你完全可以从C++中调用C代码,没有问题!

最差的情况是,您可能需要显式地将您从Pure Data调用的函数声明为“extern C”。但几乎可以肯定,Pure Data已经为您做到了这一点(您可能会在Pure Data头文件中看到“extern C”)。

以下是更多信息:

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

希望这能帮到你!


2
我认为根据问题,原帖想要从C中调用C++,而不是反过来。 - Alok Save
我想反过来使用它:从C调用C++。 - Pedro
但是可以假设Pure Data,无论它是什么,只知道C语言。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接