繁体   English   中英

在C中使用C ++结构

[英]Using C++ struct in C

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

struct S
{
   int a;
   int b;

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

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

您可以从C程序访问用C ++编写的struct的成员, 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(通过添加虚函数),它就不再兼容,您必须使用其他一些技术。

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

struct S
{
   int a;
   int b;

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

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

如果您的程序是用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调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM