C ++からAda関数を呼び出すことはできますか?
-
05-07-2019 - |
質問
私は完全なエイダ初心者です。ただし、HS中に2〜3年間Pascalを使用しました。
IIRCでは、C / C ++からPascalコンパイル済み関数を呼び出すことができます。手続きを呼び出すことは可能ですかC ++からAdaで書かれた関数?
他のヒント
これは、g ++ / gnatmake 5.3.0を使用した例です。
注:C ++とAdaの間でデータを渡すときは注意してください
ada_pkg.ads
package Ada_Pkg is
procedure DoSomething (Number : in Integer);
pragma Export (C, DoSomething, "doSomething");
end Ada_Pkg;
ada_pkg.adb
with Ada.Text_Io;
package body Ada_Pkg is
procedure DoSomething (Number : in Integer) is
begin
Ada.Text_Io.Put_Line ("Ada: RECEIVED " & Integer'Image(Number));
end DoSomething;
begin
null;
end Ada_Pkg;
main.cpp
/*
TO BUILD:
gnatmake -c ada_pkg
g++ -c main.cpp
gnatbind -n ada_pkg
gnatlink ada_pkg -o main --LINK=g++ -lstdc++ main.o
*/
#include <iostream>
extern "C" {
void doSomething (int data);
void adainit ();
void adafinal ();
}
int main () {
adainit(); // Required for Ada
doSomething(44);
adafinal(); // Required for Ada
std::cout << "in C++" << std::endl;
return 0;
}
参照:
そのようなことは常に行われます。コツは、ルーチンに「C」スタイルの呼び出しプロトコルを使用するように両側に指示することです。 C ++では、これはextern&quot; C&quot;で行われます。宣言、およびプラグマExport(&quot; C&quot ;, ...
を使用したAda側詳細については、それぞれのお気に入りの参照元で調べてください。ポインターおよび参照パラメーターに注意してください!
絶対に可能です。過去5年間、私はC ++とAdaを組み合わせたシステムに取り組んできました。
はい。数年前、私はそれを証明するために短い簡単なデモを書きました。 DLLは2つあり、1つはC ++で記述され、もう1つはAdaで記述されていました。浮動小数点値に定数を追加しただけです。 C ++とAdaの2つのアプリは、それぞれ両方のDLLを使用しました。したがって、Adaから呼び出される/呼び出されるC ++のすべての可能な組み合わせが存在しました。すべてうまくいきました。これは、Windowsでその時点で最新のバージョンでした。覚えていないが、これはLinuxやBeOSで動作するかもしれない。
ここからソースコードを見つけることができたら...