【发布时间】:2019-09-24 20:20:52
【问题描述】:
我有一个 C++ 类 A 具有方法,而其中一些使用另一个 C++ 类 B 的实例作为参数,而有些则返回另一个 C++ 类 C 的实例。如何在 C 语言中正确包装类 A 及其所有方法?
我不认为我的问题是重复的,因为所有现有示例都显示了简单 C++ 类的 C 包装器(标题和源代码),其方法具有简单数据类型的参数或返回值,例如 int 、char*等
class A {
public:
A(int param1);
int getValue();
private:
int value;
}
// method B::DoSomething() has a parameter of type (class) "A"
class B {
public:
void DoSomething(A param1);
}
// method C::SetSomething() returns an instance of class "A"
class C {
public:
A SetSomething(int value);
}
我知道如何为 A 类及其方法编写 C 语言包装器:使用 extern "C" { ... } 构造。
但是对于 B 和 C 类及其方法如何做呢?
【问题讨论】:
-
C API 首先如何暴露
A? -
如果你有
A、B和C作为结构,然后有一些像void B_DoSomething(struct A *param1)和struct A C_SetSomething(int value)这样的函数。这是你想要的吗? -
C 语言在其结构中没有可访问性(例如
public或private)。此外,如果你想在 C 结构中使用函数,则必须使用函数指针。 -
这是可行的,因为有编译器从C++转换为C。他们使用对象作为参数,例如object.DoSomething(param)变成DoSomething(object, param);,每个方法都根据重命名到它的签名(它的参数和返回值的类型)