D和C ++当前互操作性状态

Dun*_*uns 4 c++ programming-languages d language-interoperability abi

我想学习D,但是我不太了解重要的事情。C ++和D之间的当前互操作性状态如何?

我确定不可能链接到C ++编译的二进制文件,因为它甚至不能与C ++编译器一起使用。但是,如果我有C ++库的源代码和一些D源代码,该怎么办?可以让他们说话吗?(希望以一种有效的方式)。

不同的C ++版本(C ++ 98、11、14、17和将来的版本)如何?

小智 7

我是编译器团队的一员,今年夏天一直致力于 C++ 互操作,以便与用现代 C++14 编写的一段 C++ 代码进行交互。

D 很好地支持了 C++,事实上,对于这种规模的语言来说,它可能是对其提供最好支持的语言之一。例如,您可以抛出源自std::exceptionC++ 的任何异常,并在 D 端捕获它。您可以在 D 中编写一个类并从 D 中使用它(无论是否为虚拟方法),或者反之亦然。您可以从 C++ 子类化 D 类,也可以从 D 子类化 C++ 类。您可以调用实例化的模板函数!

现在,有一些问题:

  • 如果你在 C++ 中做一些不太惯用的事情,例如抛出 int,那将是一个问题。
  • C++ 代码不应破坏 D 的类型系统。例如,您不能表示 a char* const*(指向可变字符的常量指针的指针),因为 D 的 const 是传递性的,因此它必须是const char* const*
  • 跨版本支持仍然不是最佳的。目前存在 C++98 和 C++11 的混合,无法控制使用什么。在 95% 的情况下这并不重要,因为 D 在二进制级别进行接口,并且只关心调用约定和符号修饰。

至于平台,Windows 得到了很好的支持(我们有一些游戏开发人员使用它)。POSIX 对调用模板函数的支持是最近才出现的,但对我来说很有效。

这就是语言支持。围绕它的工具(例如 Dejan 提到的)仍在构建中,业界对拥有它们非常感兴趣,因为 D 被认为使用起来更愉快,并且它可以为 C++ 开发人员提供简单的过渡路径。事实上,所有 3D 编译器(DMD、GDC、LDC)都使用用 D 编写的通用前端,并将其后端(分别为 DMC、GCC、LLVM)暴露给 C++。

长话短说:

  • 如果您想调用 C++ 并且可以腾出时间在 D 中为您的类/函数编写一些绑定,是的。
  • 如果您无法编写绑定,请继续关注。
  • 如果您想将 D 代码公开给 C++,答案是肯定的!


Dej*_*kic 5

在最近几年中,与C ++的D互操作性得到了很大的改善。在“C ++语言接口”的“d规范”的部分是一个良好的开端,如果你想了解more.You可能也想看看“神奇” 民进党项目- https://code.dlang.org/packages/ dpp

我不理解您关于链接的问题...无论您使用Assembly,C,C ++,D或它们的任何组合,链接器都是相同的...您能够链接C ++库,但您可能不会能够使用其中的所有内容(取决于库中的内容)。我已经看到了与Boost库链接的D应用程序的示例。