C++和D之间的链接兼容性问题

21

D可以轻易地与C进行接口。

DC++的接口同样容易,但是(这是一个很大的限制),C++需要非常简单。代码不能使用:

  • 命名空间
  • 模板
  • 多重继承
  • 将虚拟方法与非虚拟方法混合使用
  • 还有更多?

我完全理解继承的限制。然而,其他的东西感觉像是人为的限制。现在我不想直接使用std::vector<T>,但我真的希望能够链接到std::vector<int>作为外部模板。

C++接口页面有这样一个特别令人沮丧的评论。

D模板和C++模板几乎没有任何共同之处, 而且很难找到任何合理的方法来表达 C++模板以与D兼容的方式进行链接。

这意味着C++ STL和C++ Boost可能永远无法从D中访问。

诚然,在使用D编码时,我可能永远不需要std::vector,但我很想使用QTboost

那么问题来了。为什么在D中表达非平凡的C++类如此困难?添加一些特殊注释之类的东西来表示至少命名空间是否值得这样做?


更新:

"D正在处理命名空间支持" 来自 Walter Bright

11
甚至没有任何主流的C++编译器支持它。你为什么会期望其他语言来支持它呢? - Hans Passant
5
@Hans,你指的是什么? - deft_code
3
我认为他的意思是,“链接到编译器X生成的C++代码”甚至不被{主流C++编译器}\X支持。 - FeepingCreature
4
我指的是模板,那个令人沮丧的评论。可导出的模板已从C++0x标准中删除。有Edison的支持,他是唯一一个使其正常工作的人。@Feep也是正确的。 - Hans Passant
这在Windows之外没有帮助。 - Demi
显示剩余2条评论
3个回答

27

FWIW,Qt有一个积极开发的D绑定:http://www.dsource.org/projects/qtd

我认为Boost中的许多组件与C ++联系过于紧密,难以有意义地移植到其他语言。

如果您花时间编写常规函数(例如命名空间级别)以转发到适当的成员函数,则可以使用std::vector等。虽然这很繁琐,但对于更高级别的组件来说是可以接受的(对于std::vector可能不行)。

此外,我最近在标准库中检查了一个密封的数组和密封的二叉堆实现,它们使用引用计数、malloc/free和确定性析构而不是垃圾回收(请参见http://www.dsource.org/projects/phobos/browser/trunk/phobos/std/container.d)。其他容器也会跟进。这些容器使用三种特定技术(在我的即将到来的文章“Sealed Containers”中描述)实现确定性析构,而不会损害程序安全性。

希望密封容器能够消除任何需要链接STL容器的需求,即使对于不能承受垃圾回收的紧密应用程序也是如此。


只要稍微了解STL,不必知道太多关于Boost的内容,我可以断言在D语言中几乎没有什么东西是无法像STL或Boost一样甚至更好地实现的。尽管如此,能够使用它们将允许更好地与高级别C++代码进行交互。 - BCS
2
我特别想要的Boost库是Boost.Asio。我不知道是否有可比的跨平台网络库。我相信我可以找到其他的库。此外,问题不在于D语言中不能编写类似的库,而是已经有人编写、测试并在许多不同的项目中使用了它。 - deft_code

17
正如 Hans Passant 在评论中提到的那样,你想要在 D 和 C++ 之间实现的互操作性水平甚至都不受不同的 C++ 编译器支持。似乎有一种 C++ ABI(应用程序二进制接口)标准得到了部分支持,但我不确定具体程度(Intel、GCC 和 ARM 编译器似乎遵循该ABI)。我没有使用它的需求,并且我不确定微软是否为其 x86 或 x64 编译器遵循它(我想 ia64 可能会,因为这是 ABI 标准开始的地方)。
请参阅 Joe Goodman 的 "Interoperability & C++ Compilers" 以了解有关 C++ ABI 的详细信息。
也许可以说服 Walter Bright 支持符合 ABI 标准的 C++ 库/对象与 D 的互操作性(尽管我不确定他可能会优先考虑哪个)。

2

仅仅是为了好玩,我一直在与一些C++代码进行接口交互。

这可能并不能回答你的问题,但我认为你(以及D社区中的一些人)可能会对我当时做的一些笔记感兴趣。下面是链接:TechNotes


失败模式文档加1。 - Quonux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接