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

时间:2010-06-11 15:37:47

标签: c++ templates d

D可轻松与C接口。

DC++的接口很容易,但是(并且它很大但是C++需要非常简单。代码无法使用:

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

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

C++ interfacing page有这个特别令人沮丧的评论。

  

D模板几乎没有共同之处   C ++模板,这是不太可能的   任何合理的方法   可以发现它表达C ++   模板以链接兼容的方式   与D。

     

这意味着C ++ STL和C ++   提升,可能永远无法访问   来自D.

不可否认,我在std::vector编码时可能永远不需要D,但我很乐意使用QTboost

那是什么交易。为什么在D中表达非平凡的C++类很难?是否值得添加一些特殊注释或至少表达名称空间的东西?


更新: “D在作品中有名称空间支持”来自Walter Bright

3 个答案:

答案 0 :(得分: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)。其他容器将随之而来。这些容器使用三种特定技术(在我即将发表的文章“密封容器”中描述)在不影响程序安全的情况下实现确定性破坏。

希望密封容器可以避免任何与STL容器链接的需要,即使对于无法负担垃圾收集的紧密应用也是如此。

答案 1 :(得分:17)

正如Hans Passant在评论中提到的那样,在不同的C ++编译器中甚至不支持D和C ++之间所需的互操作性。有一个C ++ ABI(应用程序二进制接口)标准似乎有一些支持,但我不确定究竟有多广泛(英特尔,GCC和ARM编译器似乎遵循ABI)。我没有必要使用它,我不确定微软是否坚持使用它的x86或x64编译器(我想它可能适用于ia64,因为这是ABI标准的开始)。

有关C ++ ABI的一些详细信息,请参阅"Interoperability & C++ Compilers" by Joe Goodman

也许Walter Bright可以说服支持与符合ABI标准的C ++库/对象的D互操作性(虽然我不确定他可能优先考虑它的位置)。

答案 2 :(得分:2)

为了好玩,我一直在使用一些C ++代码。

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