我已经阅读了解释如何从 D 调用 C++ 的文档:http://dlang.org/cpp_interface.html .然而,有几件事对我来说不是很清楚。
以D网站提供的例子为例:
#include <iostream>
using namespace std;
class D {
public:
virtual int bar(int i, int j, int k)
{
cout << "i = " << i << endl;
cout << "j = " << j << endl;
cout << "k = " << k << endl;
return 8;
}
};
D *getD() {
D *d = new D();
return d;
}
然后可以从 D 调用 C++ 类,如下所示:
extern (C++) {
interface D {
int bar(int i, int j, int k);
}
D getD();
}
void main() {
D d = getD();
d.bar(9,10,11);
}
我不太清楚 C++ 对象是如何被删除的。 D 垃圾收集器是否在 C++ 对象上调用 delete,或者我们是否需要提供一个“删除”函数来删除对象并从 D 中手动调用它?在我看来,如果我向 C++ 类添加一个析构函数,它就永远不会被调用。我还注意到,C++ 类必须以与在 D 接口(interface)中声明的顺序完全相同的顺序声明成员函数(例如,如果我在 bar() 方法之前添加析构函数,则无法从 D 调用 C++ 对象,但是如果在 bar() 方法之后声明了析构函数,则一切正常)。
如果D接口(interface)定义为:
extern(C++){
interface D{
int bar();
int foo();
}
}
对应的C++类由下式给出:
class D{
public:
virtual int bar(){};
virtual int foo(){};
};
如何保证 C++ 虚方法 vtbl 将按照与 D 接口(interface)中声明的方法相同的顺序创建。对我来说,对此没有任何保证。换句话说,我们如何确定 D::bar() 将位于 vtbl 中的第一个位置?这不依赖于实现/编译器吗?
最佳答案
我不希望 D 的垃圾收集器知道如何释放 C++ 对象。这意味着(至少)D 运行时:
- 对 C++ 运行时做出假设,即如何删除 C++ 对象
- 其他 C++ 代码不再需要该对象
我确定您必须提供另一个 C++ 函数来调用传递给它的对象。事实上,许多 C++ 库(即使也从 C++ 中使用)在从库内部调用构造函数的情况下具有相同的模式。即使在直接 C 中,在一个 dll/exe 中分配内存并在另一个中释放它通常也是一个坏主意。如果两个二进制文件不共享同一个运行时库,这可能会严重破坏。
关于c++ - 从 D 调用 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20893471/