在C代码中使用C ++库

我有一个C ++库,提供pipe理数据的各种类。 我有图书馆的源代码。

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

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

这在技术上是不可能的吗?

有什么需要注意的问题吗?

有关于此的资源,示例代码和/或文档吗?


我发现了一些其他的东西:

  1. 使用以下内容来包装需要由C代码使用的C ++头文件。

#ifdef __cplusplus extern "C" { #endif // // Code goes here ... // #ifdef __cplusplus } // extern "C" #endif 
  1. 将“真正的”C ++接口保存在不包含在C中的单独的头文件中。 使用#ifndef __cplusplus #error东西在这里帮助检测任何疯狂。
  2. 在C代码中谨慎使用C ++标识符作为名称
  3. C和C ++编译器之间的枚举大小不一。 如果您使用GNU工具链,可能不是问题,但仍然要小心。
  4. 对于结构遵循以下forms,以便C不会感到困惑。

     typedef struct X { ... } X 
  5. 然后使用指针传递C ++对象,它们只需要在C中声明为结构X,其中X是C ++对象。

所有这一切都是由一位C ++精灵的朋友提供的。

是的,这当然是可能的。 你将需要用C ++编写一个接口层,用extern "C"声明函数:

 extern "C" int foo(char *bar) { return realFoo(std::string(bar)); } 

然后,你将从你的C模块中调用foo() ,它将把这个调用传递给用C ++实现的realFoo()函数。

如果您需要使用数据成员和方法公开一个完整的C ++类,那么您可能需要做的工作比这个简单的函数示例更多。

C ++ FAQ Lite: “如何混合C和C ++代码” 。

以下问题的答案描述了一些疑难问题:

  • [32.8]如何将C ++类的对象传递给C函数?
  • 我的C函数可以直接访问C ++类的对象中的数据吗?

主要问题:C中不能捕获exception。如果在C ++代码中有可能出现exception,请仔细写出C代码或C ++包装。 相反,C代码中的exception机制(如longjump)(如各种脚本语言中所见)不需要为堆栈上的C ++对象调用析构函数。

你可以混合使用C / C ++代码。 如果你的main()函数在C ++中,那么你只需要确保你的c函数被声明了

 extern "C" 

如果你的main是C,那么除了静态variables,你可能还好。 任何具有你的静态variables的构造函数都应该在main()开始之前被调用。 如果C是你的主,这不会发生。 我有很多静态variables,最好的办法是用单例replace静态variables。