Ada から C++ 関数を呼び出すことはできますか?
C で実装を行ったり、C++ ラッパー & および Ada ラッパーを作成したりせずに、これを直接行う方法があるかどうか疑問に思っています。
コンパイラにとらわれない唯一の答えは、システム上の 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);
Ada to C++ の問題は、C++ には定義済みの ABI がないことです。
各コンパイラは、最も効率的な ABI を定義できます。
したがって、他の言語 (Ada) からのインターフェイスは、C++ メソッド/関数を呼び出すための正しいコードを生成する前に、C++ がどのコンパイラでコンパイルされたかを Ada コンパイラが知る必要があるため、面倒です。
一方、C ABI はすべてのコンパイラの標準として明確に定義されているため、あらゆる言語に接続するための優れた便利なインターフェイスを提供します。
Ada から C++ へのオブジェクト レベルのバインディングについて説明しているこのペーパーに興味があるかもしれません。
http://www.adacore.com/uploads/technical-papers/Class_level_interfacing.pdf
また、GNAT の最近のバージョンには、強力な自動バインド ジェネレーターが搭載されています。
私は 99/00 以降 Ada に触れていないので、私の記憶は少し大雑把かもしれませんが、Ada でグラフィカルな Windows アプリに取り組んでいたとき、C++ (非ミッション クリティカル) でいくつかのことを行う必要があり、2 つを組み込んだ方法について説明しました。 C++ を dll(s) に入れ、その DLL への C ラッパーを作成し、C ラッパーを指定したプラグマ インターフェイスを使用して、そのインターフェイスから dll 内のメソッドを呼び出すことができました。
c++ dll でメソッド シグネチャが変更された場合は、プラグマ インターフェイスと C ラッパーでメソッド シグネチャを更新する必要があったため、3 重のメンテナンスが必要になったと思います。
基本的に痛かったです。C ラッパーで Win32 Lean and Mean プリコンパイラ ディレクティブを使用する必要があったと思います。
とにかく、プロジェクトに携わった私たち3人が覚えているのはそれだけです。
Green Hills Software も、これに関するすばらしい PDF を公開しています。
http://www.ghs.com/download/whitepapers/ada_c++.pdf