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

我想知道是否有办法直接执行此操作,而无需在C中执行并编写C ++包装器&和Ada包装,例如我想去c ++ - > Ada而不是c ++ - > c - >阿达。

有帮助吗?

解决方案

Ada to C ++的问题在于C ++没有定义的ABI。
允许每个编译器定义最有效的ABI。

因此,与其他语言(Ada)的接口很麻烦,因为您需要Ada编译器知道C ++编译的编译器,然后才能生成正确的代码来调用任何C ++方法/函数。

另一方面,C ABI在所有编译器中都是一个标准,因此为任何语言提供了一个非常方便的界面。

其他提示

我能给你的唯一真正与编译器无关的答案是,它与在系统上从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);

您可能对本文讨论Ada与C ++的对象级绑定:

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

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

似乎不可能......

来自此处的信息

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

swig也许能够做到这一点

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

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

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

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

Green Hills Software也发布了一篇很好的PDF文章。
http://www.ghs.com/download/whitepapers/ada_c++.pdf

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top