我有一个C++
内部方法的结构:
struct S
{
int a;
int b;
void foo(void)
{
...
};
}
我有一个用户程序,用C
. 是否可以获得指向S
-struct 的指针并访问成员a
和b
?
您可以从 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 提供一个 extern "C" 接口并在您的 C 部分中使用它。
#ifdef __cplusplus
extern "C" {
#endif
struct S;
int getA(S*);
int getB(S*);
#ifdef __cplusplus
}
#endif
提供 getA 和 getB 实现的部分必须编译为 C++,但可以从 C 中调用。