可以从 Ada 调用 C++ 函数吗?

pax*_*977 6 c++ ada

可以从 Ada 调用 C++ 函数吗?

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

T.E*_*.D. 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..
}
Run Code Online (Sandbox Code Playgroud)

在你的 .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);
Run Code Online (Sandbox Code Playgroud)


Mar*_*ork 4

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

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

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