在C代码中使用C ++库

我有一个C ++库,其中提供了用于管理数据的各种类。我有该库的源代码。


我想扩展C ++ API以支持C函数调用,以便该库可以与C代码和C ++代码同时使用。


我正在使用GNU工具链(gcc,glibc等),因此语言和体系结构支持不是问题。


有什么原因导致这在技术上是不可能的?


我需要注意任何陷阱吗?


是否有与此相关的资源,示例代码和/或文档?


我发现的其他一些内容:


使用以下代码包装C代码需要使用的C ++标头。

#ifdef __cplusplus

extern "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 ++向导的朋友提供的。


烙印99
浏览 455回答 4
4回答

繁华开满天机

C ++ FAQ Lite:“如何混合C和C ++代码”。这些问题的答案描述了一些陷阱:[32.8]如何将C ++类的对象传递给C函数或从C函数传递?[32.9]我的C函数可以直接访问C ++类的对象中的数据吗?

慕尼黑8549860

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

月关宝盒

您可以混合使用C / C ++代码。如果您的main()函数使用C ++编写,则只需确保声明了c函数extern "C"如果您的main是C,那么除了静态变量外,您可能还可以。任何带有静态变量的构造函数都应在main()开始之前调用。如果C是您的主要角色,则不会发生这种情况。我有很多静态变量,最好的办法是用单例替换静态变量。
打开App,查看更多内容
随时随地看视频慕课网APP