5

我有一个C++内部方法的结构:

struct S
{
   int a;
   int b;

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

我有一个用户程序,用C. 是否可以获得指向S-struct 的指针并访问成员ab

4

3 回答 3

8

您可以从 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(通过添加虚函数)添加到您的结构中,它将不再兼容,您必须使用其他一些技术。

于 2012-10-21T17:42:01.930 回答
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.

于 2012-10-21T17:44:13.407 回答
2

如果您的程序是用 C 编写的,您如何获得 S?我的猜测是,最准确的描述是您的程序是用 C 和 C++ 混合编写的,并且您希望在 C 部分访问 C++ 结构的某些成员。

解决方案 1:修改您的 C 部分,使其位于 C 和 C++ 的公共子集中,将结果编译为 C++,现在您可以逐渐使用您想要的任何 C++ 功能。这就是过去许多项目所做的。最近最广为人知的是 GCC。

解决方案 2:为 S 提供一个 extern "C" 接口并在您的 C 部分中使用它。

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

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

于 2012-10-21T17:42:10.863 回答