5

私はまだ Ada プログラミングの世界に慣れていないので、この質問が明らかな場合はご容赦ください。

シリアルポートから読み取り、基本的に外部デバイスから受信した文字列と数値の操作を実行するアプリケーション (Ada では、2005 リビジョンの機能を使用) の開発を検討しています。

ここでの私の意図は、Florist と POSIX ターミナル インターフェイスを使用して、最初に Linux ですべてのシリアル作業を行うことでした.... Windows/MacOS/etc... には別の機会にアクセスしますが、そのオプションは開いたままにしておきたいと思います。 .

これで何をするにしても、Ada のベスト プラクティスに従いたいと思います。したがって、C での条件付きコンパイルのようなハック (Ada にはとにかくないことはわかっています) の代わりに、コマンド ラインからパッケージ ファイルの変更を指定する方法を知りたいです (たとえば、gnatmake)?

今考えられる唯一のことは、すべてのプラットフォーム パッケージにまったく同じ名前を付け (つまり、同じファイル名のパッケージ名 Serial.Connector)、それらをプロジェクト アーカイブ内の異なるフォルダーに配置し、コンパイル時にディレクトリ/ライブラリを指定することです。 -I 引数を使用してファイルを検索し、異なるプラットフォームのディレクトリ名を変更します。

これは、C/C++ を使用して GCC で表示された方法です...これは、GNAT を使用する Ada でまだ最善の方法ですか?.

ありがとう、ジョシュ

4

3 に答える 3

5

これは、この種の状況を処理するための完全に受け入れられる方法です。可能な限り、共通のパッケージ仕様 (または複数の仕様が適切な場合は仕様) を用意し、プラットフォーム固有のものはすべて、対応するパッケージ本体のバリエーションに厳密に限定する必要があります。

(プリプロセッサ パスをたどりたい場合は、使用できるgnatprepという GNAT プリプロセッサがありますが、条件付きコンパイルも好きではないので、別のサブディレクトリ アプローチを使用することをお勧めします。)

于 2010-07-23T18:48:27.113 に答える
4

GNAT プロジェクト ファイルを使用できますpackage Naming。実際の例からの抜粋です。同じディレクトリにあるパッケージの 2 つのバージョンから選択したいのですが、1 つはデバッグが追加されています。

...
type Debug_Code is ("no", "yes");
Debug : Debug_Code := External ("DEBUG", "no");
...
package Naming is
   case Debug is
      when "yes" =>
         for Spec ("BC.Support.Managed_Storage")
           use "bc-support-managed_storage.ads-debug";
         for Body ("BC.Support.Managed_Storage")
           use "bc-support-managed_storage.adb-debug";
      when "no" =>
         null;
   end case;
end Naming;

特別な命名を選択するには、環境変数DEBUGを に設定するyesか、 でビルドしgnatmake -XDEBUG=yesます。

于 2010-07-24T16:49:30.993 に答える
3

はい、Ada でこれを処理する一般的に受け入れられている方法は、ビルド システムによって選択された別のファイルを使用することです。Gnu make は可能な限りマルチプラットフォームであり、さまざまな構成でさまざまなファイル (さまざまな名前やディレクトリなど) を構築できます。

実際のところ、#ifdefこれは C でも (s よりも) 優れた方法だと思います。

于 2010-07-23T22:44:09.473 に答える