我有一个C ++库,提供各种用于管理数据的类。我有这个库的源代码。
我想扩展C ++ API以支持C函数调用,以便库可以同时与C代码和C ++代码一起使用。
我正在使用GNU工具链(gcc,glibc等),所以语言和架构支持不是问题。
为什么技术不可能?
我需要注意哪些陷阱?
是否有关于此的资源,示例代码和/或文档?
我发现的其他一些事情:
#ifdef __cplusplus
extern "C" {
#endif
//
// Code goes here ...
//
#ifdef __cplusplus
} // extern "C"
#endif
#ifndef __cplusplus #error
内容有助于检测任何疯狂。对于结构体,请遵循以下形式,以便C不会混淆。
typedef struct X { ... } X
然后使用指针传递C ++对象,它们只需要在C中声明为struct X,其中X是C ++对象。
所有这一切都是出于朋友的礼貌,他是C ++的巫师。
答案 0 :(得分:66)
是的,这肯定是可能的。您需要在C ++中编写一个接口层,用extern "C"
声明函数:
extern "C" int foo(char *bar)
{
return realFoo(std::string(bar));
}
然后,您将从C模块调用foo()
,它将把调用传递给用C ++实现的realFoo()
函数。
如果需要使用数据成员和方法公开完整的C ++类,那么您可能需要做比这个简单函数示例更多的工作。
答案 1 :(得分:21)
C ++ FAQ Lite:"How to mix C and C++ code"。
这些问题的答案中描述了一些问题:
答案 2 :(得分:11)
主要问题:无法在C中捕获异常。如果C ++代码中存在异常上升的可能性,请非常仔细地编写C代码或C ++包装器。相反,C代码中的异常机制(即longjump)(如各种脚本语言中所见)不需要为堆栈上的C ++对象调用析构函数。
答案 3 :(得分:3)
你可以混合使用C / C ++代码。如果你的main()函数在C ++中,那么你只需要确保你的c函数被声明
extern "C"
如果你的main是C,那么你可能没有静态变量。具有静态变量的任何构造函数都应该在main()start之前调用。如果C是你的主要,这不会发生。我有很多静态变量,最好的办法是用单例替换静态变量。