4

Ada から C++ 関数を呼び出すことはできますか?

C で実装を行ったり、C++ ラッパー & および Ada ラッパーを作成したりせずに、これを直接行う方法があるかどうか疑問に思っています。

4

7 に答える 7

5

コンパイラにとらわれない唯一の答えは、システム上の C から C++ を呼び出すのと同じくらい可能だということです。

C の場合と同じように、C++ ルーチンの名前がマングルされたシンボルを見つけ出し、そのマングルされた名前にリンクする C (この場合は Ada) 側でバインディングを作成する必要があります。また、C++ 関数 extern の宣言など、C++ 側でいくつかのことを行う必要がある場合もあります。

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 to C++ の問題は、C++ には定義済みの ABI がないことです。
各コンパイラは、最も効率的な ABI を定義できます。

したがって、他の言語 (Ada) からのインターフェイスは、C++ メソッド/関数を呼び出すための正しいコードを生成する前に、C++ がどのコンパイラでコンパイルされたかを Ada コンパイラが知る必要があるため、面倒です。

一方、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 でグラフィカルな Windows アプリに取り組んでいたとき、C++ (非ミッション クリティカル) でいくつかのことを行う必要があり、2 つを組み込んだ方法について説明しました。 C++ を dll(s) に入れ、その DLL への C ラッパーを作成し、C ラッパーを指定したプラグマ インターフェイスを使用して、そのインターフェイスから dll 内のメソッドを呼び出すことができました。

c++ dll でメソッド シグネチャが変更された場合は、プラグマ インターフェイスと C ラッパーでメソッド シグネチャを更新する必要があったため、3 重のメンテナンスが必要になったと思います。

基本的に痛かったです。C ラッパーで Win32 Lean and Mean プリコンパイラ ディレクティブを使用する必要があったと思います。

とにかく、プロジェクトに携わった私たち3人が覚えているのはそれだけです。

于 2009-03-04T17:04:15.703 に答える
0

Green Hills Software も、これに関するすばらしい PDF を公開しています。
http://www.ghs.com/download/whitepapers/ada_c++.pdf

于 2009-03-04T16:46:05.170 に答える