你能从Ada调用C ++函数吗?
我想知道是否有办法直接执行此操作,而无需在C中执行并编写C ++包装器&和Ada包装,例如我想去c ++ - > Ada而不是c ++ - > c - >阿达。
答案 0 :(得分:4)
Ada to C ++的问题在于C ++没有定义的ABI 允许每个编译器定义最有效的ABI。
因此,与其他语言(Ada)的接口很麻烦,因为您需要Ada编译器知道C ++编译的编译器,然后才能生成正确的代码来调用任何C ++方法/函数。
另一方面,C ABI在所有编译器中都是一个标准,因此为任何语言提供了一个非常方便的界面。
答案 1 :(得分:4)
我能给你的唯一真正与编译器无关的答案是,它与在系统上从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);
答案 2 :(得分:2)
您可能对本文讨论Ada与C ++的对象级绑定:
http://www.adacore.com/uploads/technical-papers/Class_level_interfacing.pdf
此外,最新版本的GNAT具有强大的自动绑定生成器。
答案 3 :(得分:1)
答案 4 :(得分:1)
自99/00以来我没有碰过Ada,所以我的记忆可能有点粗略但是当我们在Ada中使用图形Windows应用程序时,我们需要用C ++做一些事情(非关键任务)和我们的方式合并这两个是在一个DLL中有c ++的东西,然后创建一个C包装到该DLL,然后使用指定c包装的pragma接口,然后我们可以从该接口调用dll中的方法。 / p>
我认为这相当于一些三维维护,因为如果在c ++ dll中更改了方法签名必须在pragma接口和C包装器中更新。
基本上这是一种痛苦。我认为我们必须在C包装器中使用Win32 Lean和Mean precomplier指令。
无论如何,我们三个参与该项目的人都记得。
答案 5 :(得分:1)
swig也许能够做到这一点
答案 6 :(得分:0)
Green Hills Software也发布了一篇很好的PDF文章 http://www.ghs.com/download/whitepapers/ada_c++.pdf