我如何在C代码中访问我的C ++函数,反之亦然?

时间:2013-03-16 18:18:08

标签: c++ c opencv cross-language

我想在 C 中实现一个项目,但是在 C ++ 中编写项目的某些部分然后从主 C中调用它们代码。
可能吗?!如果是的话,我该怎么做?!
提前谢谢:)

P.S。
我在 C ++ 代码中使用了一些库,例如 OpenCV

4 个答案:

答案 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)

是的,您需要将其指定为

  

extern“C”

这样它将使函数具有“C”链接,然后C代码可以像在C中一样调用你的函数。这个函数名称不会被破坏,因为C不支持重载。

这里让我引用@Faisal Vali:

  • extern“C”是一个链接规范
  • 每个编译器必需以提供“C”链接
  • 链接规范仅在命名空间范围内发生
  • 所有函数类型,函数名和变量名都有语言链接
  • 具有不同语言联系的两种函数类型是不同的类型,即使它们是相同的
  • 连接规范嵌套,内部确定最终链接
  • 对于班级成员,
  • extern“C”被忽略
  • 最多一个具有特定名称的函数可以具有“C”链接(无论命名空间如何)
  • extern“C”强制函数具有外部链接(不能使其静态)
  • 从C ++到其他语言定义的对象以及从其他语言在C ++中定义的对象的链接是实现定义和语言相关的。只有在两种语言实现的对象布局策略足够相似的情况下才能实现这种联系

see Faisal Vali answer here

答案 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:

http://www.parashift.com/c++-faq/mixing-c-and-cpp.html

答案 3 :(得分:0)

除非严格要求,否则这只适用于毛茸茸的masochists。这样做需要双方都非常小心,今天可以很好地工作,并在下一次编译器更新时大放异彩。 C ++需要大量的运行时帮助,并且通常不支持从C可靠地工作。您可以从C ++调用C,这是官方支持的(并且是标准的一部分,extern "C"等)。

最好的办法是在C和C ++处理的子集中编写C(微妙差异的起点为this)并使用C ++编译器进行编译。或者克服它并决定你最喜欢哪种语言。