为了账号安全,请及时绑定邮箱和手机立即绑定

在C代码中使用C ++库

在C代码中使用C ++库

C++ C
烙印99 2019-10-06 12:57:25
我有一个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 ++类的对象中的数据吗?


查看完整回答
反对 回复 2019-10-06
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

主要陷阱:C语言无法捕获异常。如果C ++代码中可能出现异常,请非常小心地编写C代码或C ++包装器。相反,C语言中的异常机制(如longjump)(在各种脚本语言中可以找到)不需要为堆栈上的C ++对象调用析构函数。


查看完整回答
反对 回复 2019-10-06
?
月关宝盒

TA贡献1772条经验 获得超5个赞

您可以混合使用C / C ++代码。如果您的main()函数使用C ++编写,则只需确保声明了c函数


extern "C"

如果您的main是C,那么除了静态变量外,您可能还可以。任何带有静态变量的构造函数都应在main()开始之前调用。如果C是您的主要角色,则不会发生这种情况。我有很多静态变量,最好的办法是用单例替换静态变量。


查看完整回答
反对 回复 2019-10-06
  • 4 回答
  • 0 关注
  • 446 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信