我想使用 Pure Data 作为我自己的库的原型设计工具。我发现 Pure Data 补丁是用 C 编写的,但我的库是用 C++ 编写的。那么如何在纯数据中使用此代码?由于我没有使用纯 C,我想知道如何为 C++ 类编写 C 包装器以及如何实例化我的类?还是我必须用 C 重写所有内容?
4 回答
您需要为每个需要调用的函数编写包装函数。例如:
// 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 命名约定。
您还可以使用flext 框架使用 C++ 为 Pure Data 编写对象。
让我换一种说法:
1) 你可以从 C++ 源代码调用 C 函数、数据和库,也可以从 C 调用 C++ 源代码。
2) 然而,每当 C 调用 C++ 源代码时,该源代码必须用 C++ 的 C 子集编写。
3)其中一部分是使用“extern C”。
4)另一部分是使用“#ifdef __cplusplus”
5)我上面引用的链接提供了很多细节
6) 我查看了Pure Data 网站。您可能需要对您的库进行一些“调整”。您可能希望创建一个新标题。但从根本上说,我认为您可能可以实现让您的库与 Pure Data 集成的目标。
恕我直言...
您绝对可以从 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
'希望有帮助!