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