我有一个C++
结构,里面有方法:
struct S
{
int a;
int b;
void foo(void)
{
...
};
}
我有一个用C
编写的用户程序。是否有可能获得指向S
- 结构的指针并访问成员a
和b
?
答案 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调用。