質問

C / C ++で複数のプラットフォームをサポートするには、プリプロセッサを使用して条件付きコンパイルを有効にします。例:

#ifdef _WIN32
  #include <windows.h>
#endif

Adaでこれを行うにはどうすればよいですか? Adaにはプリプロセッサがありますか?

役に立ちましたか?

解決

あなたの質問に対する答えは「いいえ」です。エイダには言語に組み込まれたプリプロセッサがありません。つまり、各コンパイラには1つのコンパイラがある場合とない場合があり、「均一」ではありません。前処理や条件付きコンパイルなどの構文。これは意図的なものでした。「有害」と見なされます。エイダの精神に。

プリプロセッサの不足を回避する方法はほとんど常にありますが、多くの場合、ソリューションは少し面倒な場合があります。たとえば、プラットフォーム固有の関数を「個別」として宣言し、ビルドツールを使用して正しいものをコンパイルできます(プロジェクトシステム、プラグマボディ置換を使用、または非常に単純なディレクトリシステム...すべてのWindowsファイルを配置します) / windows /にあり、/ linux /にあるすべてのlinuxファイルにあり、プラットフォームに適切なディレクトリが含まれています。)

以上のことを言っても、GNATはプリプロセッサが必要な場合があることに気付き、gnatprepを作成しました。コンパイラに関係なく動作するはずです(ただし、ビルドプロセスに挿入する必要があります)。同様に、単純なもの(条件付きコンパイルなど)の場合は、おそらくcプリプロセッサを使用するか、独自の非常に単純なプリプロセッサを使用することもできます。

他のヒント

AdaCoreは、 gnatprep プリプロセッサを提供します。エイダ彼らは、gnatprepは「特別なGNAT機能に依存しない」と述べているため、非GNAT Adaコンパイラで動作するように聞こえます。ユーザーガイドには、条件付きコンパイルアドバイスもあります。

私はm4が使用されているプロジェクトに参加しており、Ada仕様と本文ファイルには「.m4s」という接尾辞が付いています。それぞれ「.m4b」。

私の好みは、前処理を完全に回避し、専門のボディを使用して、CMとビルドプロセスをセットアップしてそれらを管理することです。

いいえ。ただし、CPPプリプロセッサまたはm4は、コマンドライン上の任意のファイルで、またはmakeやantなどのビルドツールを使用して呼び出すことができます。 .adaファイルを別の名前にすることをお勧めします。私はこれをJavaファイルでしばらく行ってきました。 Javaファイル.m4を呼び出し、makeルールを使用して.javaを作成し、通常の方法でビルドします。

お役に立てば幸いです。

一部の古いAda1983時代のコンパイラには、Adaの#プレフィックスサブセット(ビルド時に解釈される)をAdaを生成するための前処理言語として使用するa.appと呼ばれるパッケージがあります(コンパイル時にマシンコードに変換されます-時間)。 RationalのVerdix Ada開発システム(VADS)は、いくつかのAdaコンパイラの中でa.appの先駆者のようです。たとえば、Sun MicrosystemsはVADSからAda SPARCompilerを派生させたため、a.appもありました。これは、IBMが行ったPL / IのプリプロセッサとしてのPL / Iの使用と似ています。

第2章は、a.appの外観に関するドキュメントです。 http://dlc.sun.com/pdf/802-3641/802-3641.pdf

はい、あります。

GNATコンパイラを使用している場合は、前処理に gnatprep を使用できます。またはGNAT Programming Studioを使用している場合は、プロジェクトファイルを構成して、次のような条件付きコンパイルスイッチを定義できます

#if SOMESWITCH then
-- Your code here is executed only if the switch SOMESWITCH is active in your build configuration
#end if;

この場合、 gnatmake または gprbuild を使用できるため、手動で gnatprep を実行する必要はありません。

これは、たとえば、異なるクロスコンパイラを使用しても、複数の異なるOSで同じコードをコンパイルする必要がある場合に非常に便利です。

いいえ、ありません。

本当に必要な場合は、取得する方法があります(Cを使用する、スタンドアロンのCを使用するなど)。しかし、私はそれに反対します。それを持たないことは、意図的な設計上の決定でした。プリプロセッサの全体的なアイデアは非常に非エイダです。

Cのプリプロセッサの使用目的のほとんどは、他のより信頼性の高い方法でAdaで実現できます。唯一の大きな例外は、クロスプラットフォームサポートのためにソースファイルに小さな変更を加えることです。これが典型的なクロスプラットフォームのCプログラムでどれほど悪用されるかを考えると、Adaでサポートされていないことに満足しています。変更を「マイナー」に保つのに十分な自分自身を制御できるC / C ++開発者はほとんどいません。結果はうまくいくかもしれませんが、人間が読むことはほとんど不可能です。

これを実現する典型的なAdaの方法は、異なるコードを異なるファイルに配置し、ビルドシステムを使用して、コンパイル時に何らかの方法でそれらを選択することです。 Makeはこれを行うのに十分なほど強力です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top