我想在 C 中实现一个项目,但是在 C ++ 中编写项目的某些部分然后从主 C中调用它们代码。
可能吗?!如果是的话,我该怎么做?!
提前谢谢:)
的 P.S。
我在 C ++ 代码中使用了一些库,例如 OpenCV 。
答案 0 :(得分:4)
您需要使用常规C函数“包装”C ++接口,这些函数接受一个参数来指示它们将被调用的对象。例如,如果您使用的是C ++
class A
{
// .. boilerplate stuff...
int SomeMethod(int n, float f);
};
然后与它一起,您可以声明一个诸如
之类的函数extern "C" int A_SomeMethod(void* Obj, int n, float f)
{
return(((A*)Obj)->SomeMethod(n, f));
}
如果你对void *的转换感到不舒服,你可以实现从不透明句柄到A*
的某种地图。但要点是你需要保持一些句柄/指针指向将调用该方法的对象。为了获得指针/句柄,您需要将分配包装到:
extern "C" void* A_Instantiate()
{
return new A;
}
C ++文件应该沿着单独编译,文件包含上述功能。 C编译的单独包含应包括上述所有函数的声明。
编辑:下面的警告和评论很重要;回答这个问题,“是的,可以从C调用C ++”,这是一种方法。这不是一个完整的方法,因为没有真正的机制方法,但它是一个开始。另外,不要忘记为delete
等创建另一个号召性用语
答案 1 :(得分:0)
是的,您需要将其指定为
这样它将使函数具有“C”链接,然后C代码可以像在C中一样调用你的函数。这个函数名称不会被破坏,因为C不支持重载。extern“C”
这里让我引用@Faisal Vali:
答案 2 :(得分:0)
问:我可以从C ++访问我的C代码,反之亦然吗?
答:是的。
1)主要是在所有标题中使用extern "C" { ...}
来表示仅限C的函数和数据,如下所示:
http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B
/* Header file foo.h */
#ifdef __cplusplus /* If this is a C++ compiler, use C linkage */
extern "C" {
#endif
/* These functions get C linkage */
void foo();
struct bar { /* ... */ };
#ifdef __cplusplus /* If this is a C++ compiler, end C linkage */
}
#endif
2)通常的场景是一个C ++主程序,它调用C和C ++函数和结构的混合。结构和函数都在头文件中声明,并且都有“#ifdef __cplusplus / extern C”。
3)这是关于混合C和C ++的一个很好的FAQ:
答案 3 :(得分:0)
除非严格要求,否则这只适用于毛茸茸的masochists。这样做需要双方都非常小心,今天可以很好地工作,并在下一次编译器更新时大放异彩。 C ++需要大量的运行时帮助,并且通常不支持从C可靠地工作。您可以从C ++调用C,这是官方支持的(并且是标准的一部分,extern "C"
等)。
最好的办法是在C和C ++处理的子集中编写C(微妙差异的起点为this)并使用C ++编译器进行编译。或者克服它并决定你最喜欢哪种语言。