在C中使用C ++结构

时间:2012-10-21 17:34:42

标签: c++ c struct

我有一个C++结构,里面有方法:

struct S
{
   int a;
   int b;

   void foo(void)
   {
       ... 
   };
}

我有一个用C编写的用户程序。是否有可能获得指向S - 结构的指针并访问成员ab

3 个答案:

答案 0 :(得分:7)

您可以从C程序访问用C ++编写的struct成员,前提是确保删除了对结构语法的C ++添加:

// header
struct S {
  int a, b;

#ifdef __cplusplus
  void foo(); 
#endif
};

// c-file:
#include "header.h"

void something(struct S* s)
{
  printf("%d, %d", s->a, s->b);
}

C ++中结构和类的内存布局与C语言的C部分兼容。只要在结构中添加vtable(通过添加虚函数),它就不再兼容,您必须使用其他技术。

答案 1 :(得分:3)

如果这些方法不是虚拟的,则可以。您甚至可以使用__cplusplus宏来使用C / C ++的公共头:

struct S
{
   int a;
   int b;

#ifdef __cplusplus
   void foo(void)
   {
       ... 
   }
#endif /* end section for C++ only */
};

请记住,C中此结构的名称为struct S,而不仅仅是S

答案 2 :(得分:2)

如果您的程序是用C语言编写的,那么如何获得S?我的猜测是,最准确的描述是你的程序是用C和C ++混合编写的,你想要访问C部分中C ++结构的一些成员。

解决方案1:修改你的C部分,使它在C和C ++的公共子集中,将结果编译为C ++,现在你可以逐步使用你想要的任何C ++特性。这就是许多项目过去所做的事情。最知名的是GCC。

解决方案2:为S提供一个外部“C”接口,并在C部分中使用它。

#ifdef __cplusplus
extern "C" {
#endif
    struct S;
    int getA(S*);
    int getB(S*);
#ifdef __cplusplus
}
#endif

提供getA和getB实现的部分必须编译为C ++,但可以从C调用。