2011-10-15 49 views
0

为什么在C++代码中提供其他语言的包装比C代码更难?C和C++接口

+3

把C++打包比C要困难得多? [引证需要] – corsiKa

+2

嗯,这是一个合理的问题,它真的很难。我想,只是用错误的方式蹭人。也许不用[C++]标签再问一次。 –

+2

这是一个合法的技术问题的合法问题。到OP:谷歌C + + ABI。 –

回答

1

这由图书馆本身以及它的设计有很大的不同。

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

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

2

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

由于其他语言不具备的特性,您可以考虑C++“更困难”。以多重继承为例。这是一个非常棘手的功能,许多人都说根本不使用它。但如果使用它,你会如何将它翻译成另一种语言?

不过,关键之处在于,语言本身并不难缠绕 - 问题在于其他语言中不存在的映射功能几乎不可能。但是,如果该功能不存在于该语言中,则必须问自己为什么它不在那里,如果您甚至应该首先使用它。

+0

我会给这个+1,除了“如果你甚至应该使用它”。这意味着它是一种无用的语言功能,因为其他语言不需要它,而不是“如果你应该在封装的界面中使用它” –

+0

@MooingDuck那么,“如果你应该...”可能会最终评估为真。我不会称之为多重继承之类的无用功能,而是其他语言特别避免的容易出错的功能。所以,是的,应该考虑是否要使用过去导致其他开发人员头痛的功能。 – corsiKa

1

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