我有一个C ++库,其中提供了用于管理数据的各种类。我有该库的源代码。我想扩展C ++ API以支持C函数调用,以便该库可以与C代码和C ++代码同时使用。我正在使用GNU工具链(gcc,glibc等),因此语言和体系结构支持不是问题。有什么原因导致这在技术上是不可能的?我需要注意任何陷阱吗?是否有与此相关的资源,示例代码和/或文档?我发现的其他一些内容:使用以下代码包装C代码需要使用的C ++标头。#ifdef __cplusplusextern "C" { #endif // // Code goes here ... // #ifdef __cplusplus } // extern "C" #endif将“真实的” C ++接口保留在C不包含的单独的头文件中。在这里考虑PIMPL原理。#ifndef __cplusplus #error在这里使用东西有助于发现任何疯狂。小心C ++标识符作为C代码中的名称C和C ++编译器之间的枚举大小不同。如果您使用的是GNU工具链,则可能不是问题,但仍要当心。对于结构,请遵循以下格式,以免C混淆。typedef struct X { ... } X然后使用指针传递C ++对象,只需要在C中将它们声明为struct X,其中X是C ++对象。所有这些都是由一位C ++向导的朋友提供的。
4 回答
繁华开满天机
TA贡献1816条经验 获得超4个赞
C ++ FAQ Lite:“如何混合C和C ++代码”。
这些问题的答案描述了一些陷阱:
[32.8]如何将C ++类的对象传递给C函数或从C函数传递?
[32.9]我的C函数可以直接访问C ++类的对象中的数据吗?
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
主要陷阱:C语言无法捕获异常。如果C ++代码中可能出现异常,请非常小心地编写C代码或C ++包装器。相反,C语言中的异常机制(如longjump)(在各种脚本语言中可以找到)不需要为堆栈上的C ++对象调用析构函数。
月关宝盒
TA贡献1772条经验 获得超5个赞
您可以混合使用C / C ++代码。如果您的main()函数使用C ++编写,则只需确保声明了c函数
extern "C"
如果您的main是C,那么除了静态变量外,您可能还可以。任何带有静态变量的构造函数都应在main()开始之前调用。如果C是您的主要角色,则不会发生这种情况。我有很多静态变量,最好的办法是用单例替换静态变量。
- 4 回答
- 0 关注
- 446 浏览
添加回答
举报
0/150
提交
取消