4

你能从 Ada 调用 C++ 函数吗?

我想知道是否有一种方法可以直接执行此操作,而无需在 C 中进行实现并编写 C++ 包装器 & 和 Ada 包装器,例如,我想使用 c++ -> Ada 而不是 c++ -> c -> Ada。

4

7 回答 7

5

我能给你的唯一真正与编译器无关的答案是,它就像在你的系统上从 C 调用 C++ 一样可能。

与 C 非常相似,您必须找出 C++ 例程的名称错位符号,并在 C(在本例中为 Ada)端编写一个绑定到该错位名称的绑定。您可能还必须在 C++ 方面做一些事情,例如声明 C++ 函数 extern。

如果你可以声明你的 C++ 函数 extern "C",那就很简单了。只需在 C++ 端执行此操作,并在 Ada 端使用 Ada 的标准 C 导入功能。

例子:

在你的 cpp 中:

extern "C" int cpp_func (int p1, int p2) {
   ; // Whatever..
}

在您的 .adb 中:

function cpp_func (p1, p2 : Interfaces.C.Int) return Interfaces.C.Int;
pragma Import (C, cpp_func); 

...
Result : constant Interfaces.C.Int := cpp_func (1, 2);
于 2009-03-04T22:59:53.133 回答
4

Ada 到 C++ 的问题是 C++ 没有定义的 ABI。
每个编译器都可以定义它可以定义的最有效的 ABI。

因此,与其他语言 (Ada) 交互是一件痛苦的事情,因为您需要 Ada 编译器知道 C++ 是用哪个编译器编译的,然后才能生成正确的代码来调用任何 C++ 方法/函数。

另一方面,C ABI 是跨所有编译器的明确定义的标准,因此为任何语言连接提供了一个很好的方便接口。

于 2009-03-04T17:44:49.570 回答
3

您可能对这篇论文感兴趣,它讨论了 Ada 到 C++ 的对象级绑定:

http://www.adacore.com/uploads/technical-papers/Class_level_interfacing.pdf

此外,最新版本的 GNAT 具有强大的自动绑定生成器。

于 2009-10-14T16:04:24.930 回答
1

这似乎不可能...

来自这里的信息

“从 Ada 到 C++ 的直接接口超出了 Ada 的范围(至少 95)”

于 2009-03-04T16:37:50.090 回答
1

自 99/00 以来我没有接触过 Ada,所以我的记忆可能有点粗略,但是当我们在 Ada 中开发图形窗口应用程序时,我们需要用 C++(非关键任务)以及我们将两者结合的方式做一些事情是将 c++ 的东西放在 dll 中,然后为该 DLL 创建一个 C 包装器,然后使用指定 c 包装器的 pragma 接口,然后我们可以从该接口调用 dll 中的方法。

我认为这相当于一些三重维护,因为如果方法签名在 c++ dll 中发生更改,则必须在 pragma 接口和 C 包装器中更新它们。

基本上这是一种痛苦。我认为我们必须在 C 包装器中使用 Win32 Lean and Mean 预编译器指令。

无论如何,这是我们三个参与该项目的人都记得的。

于 2009-03-04T17:04:15.703 回答
1

痛饮也许能做到

于 2009-03-04T17:14:23.840 回答
0

Green Hills Software 也就此发表了一篇很棒的 PDF。
http://www.ghs.com/download/whitepapers/ada_c++.pdf

于 2009-03-04T16:46:05.170 回答