在 C 中使用C++结构

Using C++ struct in C

本文关键字:C++ 结构      更新时间:2023-10-16

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

struct S
{
int a;
int b;
void foo(void)
{
... 
};
}

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

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

如果这些方法不是虚拟的,那么就可以了。您甚至可以使用宏为 C/C++ 提供通用标头__cplusplus:

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

请记住,C 中这个结构的名称不仅仅是Sstruct S

如果你的程序是用 C 语言编写的,你如何得到一个 S?我的猜测是,最精确的描述是你的程序是用C和C++混合编写的,并且你想访问C部分中C++结构的一些成员。

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

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

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

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