【问题标题】:C and C++ interfaceC 和 C++ 接口
【发布时间】:2011-10-15 17:15:55
【问题描述】:

为什么用其他语言为 C++ 代码提供包装器比为 C 代码提供包装器要困难得多?

【问题讨论】:

  • C++ 比 C 更难包装? [需要引用]
  • 嗯,这是一个合理的问题,它确实更难。我猜只是以错误的方式摩擦人。可能不带 [c++] 标签再问一次。
  • 这是一个合法的问题,具有合法的技术原因。致 OP:google C++ ABI。

标签: c++ c interface wrapper


【解决方案1】:

在与其他语言交互时,每种语言都有其独特的挑战。

您可以认为 C++ 在某种意义上“更难”,因为它具有其他语言所没有的特性。以多重继承为例。这是一个非常棘手的功能,许多人只是说根本不要使用。但是如果使用它,您将如何将其翻译成另一种语言?

不过,关键是该语言本身不再难以包装 - 问题在于映射其他语言中不存在的功能几乎是不可能的。但是,如果该功能在该语言中不存在,您必须问自己为什么它不存在,以及您是否应该首先使用它。

【讨论】:

  • 我会给这个+1,除了if you should even be using it at all。这意味着它是该语言的一个无用功能,因为其他语言不需要它,而不是“如果你应该在包装界面中使用它”
  • @MooingDuck 好吧,“如果你应该......”可能最终评估为真。我不会将诸如多重继承之类的东西称为无用的功能,而是将其称为其他语言特别避免的容易出错的功能。所以,是的,应该考虑一下你是否想使用过去曾让其他开发人员头疼的功能。
【解决方案2】:

这因库本身及其设计方式而异。

一般来说,C++ 更复杂,因为它有对象、类和接口,而 C 主要是函数。类的成员函数以不同的方式命名和调用,因此包装它们需要更多的工作来提供等效名称。

一旦库被包装以提供等效接口并处理调用约定,下一个区别是 C++ 允许将对象作为函数参数传递,这可能需要深拷贝等。在采用纯指针的库中,例如 COM,这不是问题(这也是 COM 与这么多语言和其他系统可互操作的部分原因),但即使在 C++ 中,处理必要的复制代码也非常依赖于编译器。

【讨论】:

    【解决方案3】:

    在某种程度上扩展其他人给出的答案,另一个需要考虑的讨厌的问题是例外。可以通过多种方式在操作系统、语言或运行时库中实现异常。 C++ 实现它们的方式在某些重要方面是独一无二的。如果从另一种语言调用 C++ 例程并引发异常,则不完全清楚应该如何处理。一种方法是简单地将所有此类异常声明为致命的。并非不合理,但它阻止了其他语言被用于执行原本有用的任务。例如,考虑一个枚举项目列表并计算总和的例程;如果其中一项的评估引发异常,则该异常应渗透到例程的调用者以枚举列表。但是,如果枚举列表的例程是用另一种语言编写的,那么安排异常通过层正确渗透可能会出现问题。

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多