我想使用Pure Data作为我自己的库的原型工具。我发现Pure Data补丁是用C编写的,但我的库是用C++编写的。那么我怎样才能在纯数据中使用这段代码呢?由于我没有使用普通的C,我想知道如何为C++类编写一个C封装器,然后如何实例化我的类?还是我必须重写C中的所有内容?C包装C++
C包装C++
回答
你需要编写封装函数为每一个需要被调用函数例如:!
// 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命名约定。
而不是使用'void *',你应该使用一个不完整的结构来获得某种类型的安全。 –
为了更好地理解,'extern'Linkage_Specification“{// code}'这种方式告诉编译器在链接代码时使用Linkage规范。 –
我不确定我完全理解你的例子。如果我在C++头文件中声明了这些外部“C”函数,为什么我必须在C中再次声明它?我不能只在我的C文件中包含C++头文件并直接调用函数吗? – Pedro
你绝对可以从C++调用C--没问题!
最糟糕的情况是,您可能必须将您从Pure Data调用的函数明确声明为“extern C”。但几乎可以肯定的是纯数据已经这样做了你(你可能会看到“外部C”在纯数据头文件
下面是详细信息:
http://msdn.microsoft.com/en-us/library/0603949d%28v=vs.80%29.aspx
“。希望帮助
让我换一种说法:
1)您还可以从C++源C函数,数据和库,你调用C从C
2 ++源)每当C调用到C++源但是,该源必须用C++的C子集编写。
3)这部分是使用“extern C”。
4)另一部分是使用 “的#ifdef __cplusplus”
5)我上面引用的联系给予大量细节
6)我看着Pure Data site。您可能需要对图书馆进行一些“调整”。您可能希望创建一个新标题。但从根本上来说,我认为你可以实现让图书馆与Pure Data集成的目标。
恕我直言...
您也可以编写使用C++使用flext framework纯数据对象。
- 1. 包装malloc - C
- 2. C#包装
- 3. SlickGrid C#包装
- 4. 在Objective C中包装Objective C C++/C++
- 5. 包装C#CLI类为C#
- 6. LAPACK包装的C/C++
- 7. 在C#中包装Visual C++#
- 8. Objective-C中包装C++类
- 9. C#包装原语
- 10. C++ CLI包装器
- 11. 包装位到C++
- 12. Swig - 包装C struct
- 13. C可变包装
- 14. C++包装=操作
- 15. 包装OpenCV C++与C#一起使用
- 16. 如何在Objective-C中包装C++库?
- 17. 原生C++ dll的C++/CLI包装器
- 18. 从c头自动创建C#包装?
- 19. SVNKit像C或C++的包装器
- 20. 使用SWIG包装C/C++库
- 21. C#包装类为c + +的DLL dll
- 22. C++包装C结构*和*和功能
- 23. 对象的C#包装
- 24. Encoding.com的C#包装器?
- 25. C库的Qt包装
- 26. C#包装和回调
- 27. 用Cython包装C++库
- 28. C#VLC 1.1包装器
- 29. C++/CLI模板包装轮
- 30. C#的GnuPG包装器#
稍微晚了一点,但我写了一个关于C++的C封装的小指令:http://www.teddy.ch/c++_library_in_c/ – Teddy