7

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

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

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

4

6 に答える 6

8

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

ほとんどの場合、プリプロセッサの欠如を回避する方法がありますが、多くの場合、解決策は少し面倒です。たとえば、プラットフォーム固有の関数を「個別」として宣言し、build-tools を使用して正しい関数をコンパイルできます (プロジェクト システム、プラグマ本体置換を使用する、または非常に単純なディレクトリ システムのいずれか... すべての Windows ファイルを配置します)。 /windows/ および /linux/ 内のすべての linux ファイルで、プラットフォームに適切なディレクトリを含めます)。

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

于 2008-11-20T13:57:26.480 に答える
7

AdaCore は、Ada に特化したgnatprepプリプロセッサを提供します。彼らは、gnatprep は「特別な GNAT 機能に依存しない」と述べているため、GNAT 以外の Ada コンパイラでも動作するはずです。ユーザー ガイドには、条件付きコンパイルのアドバイスも記載されています。

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

私の好みは、前処理を完全に避けて、特殊な本体を使用し、CM とビルド プロセスを設定してそれらを管理することです。

于 2008-11-18T21:27:21.657 に答える
3

はい、あります。

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;

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

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

于 2011-11-25T03:00:08.270 に答える
3

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

それが役立つことを願っています。

于 2008-11-12T13:27:31.323 に答える
2

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

第 2 章は、a.app がどのように見えるかについてのドキュメントです: http://dlc.sun.com/pdf/802-3641/802-3641.pdf

于 2010-04-10T14:03:12.137 に答える
0

いいえ、違います。

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

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

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

于 2008-11-20T14:23:03.697 に答える