在C代码中使用C ++库
我有一个C ++库,提供pipe理数据的各种类。 我有图书馆的源代码。
我想扩展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中的单独的头文件中。 使用
#ifndef __cplusplus #error
东西在这里帮助检测任何疯狂。 - 在C代码中谨慎使用C ++标识符作为名称
- C和C ++编译器之间的枚举大小不一。 如果您使用GNU工具链,可能不是问题,但仍然要小心。
-
对于结构遵循以下forms,以便C不会感到困惑。
typedef struct X { ... } X
-
然后使用指针传递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。