如何在C中使用C ++类?

时间:2014-09-12 06:33:17

标签: c c++11

我有一个C ++类:

class foo{
  .
  .
  .
};

我想在C代码中使用它,如下所示:

file.c

foo funct(class foo f){
  .
  .
  .
  return f;
}

这里我想在C函数中使用C ++类,它接收一个C ++类作为arg并返回它。

1 个答案:

答案 0 :(得分:6)

您不能直接从C调用C ++类方法,但是您可以提供一组使用extern "C"声明声明和定义的包装函数。然后使用void*样式转换方法用C函数包装每个公共方法。

这是一个简单的例子,允许一个名为“Foo”的类与C代码链接并从中调用。

foo.h中

 #ifndef FOOCLASS_H
 #define FOOCLASS_H

 class Foo
 {
 public:
      int M1();
      int M2(int x);
 };

 #endif

FooWraper.h

 #ifndef FooWrapper_H
 #define FooWrapper_H

 #ifdef __cplusplus
 extern "C" {
 #endif

     void* createFoo();
     int Foo_M1(void* foo);
     int Foo_M2(void* foo, int x);

 #ifdef __cplusplus
 }
 #endif

 #endif

FooWraper.cpp

 extern "C" void* createFoo()
 {
     Foo* foo = new Foo();
     return (void*)foo;
 }

 extern "C" void* deleteFoo(void* foo)
 {
     Foo* pRealFoo = (Foo*)foo;
     delete pRealFoo;
 }

 extern "C" int Foo_M1(void* foo)
 {
       return ((Foo*)foo)->M1();
 }

 extern "C" int Foo_M2(void* foo, int x)
 {
       return ((Foo*)foo)->M2(x);
 }

的main.c

#include "FooWraper.h"

int main()
{
     void* foo = createFoo();
     Foo_M2(foo, 42);
     deleteFoo(foo);
}