C/C++ で複数のプラットフォームをサポートするには、プリプロセッサを使用して条件付きコンパイルを有効にします。例えば、
#ifdef _WIN32
#include <windows.h>
#endif
Adaでこれをどのように行うことができますか? Ada にはプリプロセッサがありますか?
C/C++ で複数のプラットフォームをサポートするには、プリプロセッサを使用して条件付きコンパイルを有効にします。例えば、
#ifdef _WIN32
#include <windows.h>
#endif
Adaでこれをどのように行うことができますか? Ada にはプリプロセッサがありますか?
あなたの質問に対する答えはノーです。Ada には、言語に組み込まれているプリプロセッサがありません。つまり、各コンパイラにはコンパイラがある場合とない場合があり、前処理や条件付きコンパイルなどのための「統一された」構文はありません。これは意図的なものでした。エイダの精神にとって「有害」であると考えられています。
ほとんどの場合、プリプロセッサの欠如を回避する方法がありますが、多くの場合、解決策は少し面倒です。たとえば、プラットフォーム固有の関数を「個別」として宣言し、build-tools を使用して正しい関数をコンパイルできます (プロジェクト システム、プラグマ本体置換を使用する、または非常に単純なディレクトリ システムのいずれか... すべての Windows ファイルを配置します)。 /windows/ および /linux/ 内のすべての linux ファイルで、プラットフォームに適切なディレクトリを含めます)。
そうは言っても、GNAT は、プリプロセッサが必要な場合があることに気付き、gnatprep を作成しました。コンパイラに関係なく動作するはずです (ただし、ビルド プロセスに挿入する必要があります)。同様に、単純なもの (条件付きコンパイルなど) の場合は、c プリプロセッサを使用するか、独自の非常に単純なものをロールすることもできます。
AdaCore は、Ada に特化したgnatprepプリプロセッサを提供します。彼らは、gnatprep は「特別な GNAT 機能に依存しない」と述べているため、GNAT 以外の Ada コンパイラでも動作するはずです。ユーザー ガイドには、条件付きコンパイルのアドバイスも記載されています。
私は、Ada の仕様ファイルと本体ファイルにそれぞれ「.m4s」と「.m4b」という接尾辞が付いた m4 も使用されたプロジェクトに参加しました。
私の好みは、前処理を完全に避けて、特殊な本体を使用し、CM とビルド プロセスを設定してそれらを管理することです。
はい、あります。
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
orを使用できるgprbuild
ので、手動で実行する必要はありませんgnatprep
。
これは、たとえば、異なるクロス コンパイラを使用して複数の異なる OS 用に同じコードをコンパイルする必要がある場合に非常に便利です。
いいえ、CPP プリプロセッサまたは m4 は、コマンド ラインまたは make や ant などのビルド ツールを使用して任意のファイルで呼び出すことができます。.ada ファイルを別の名前にすることをお勧めします。私はJavaファイルでこれをしばらく行ってきました。Java ファイルを .m4 と呼び、make ルールを使用して .java を作成し、通常の方法でビルドします。
それが役立つことを願っています。
一部の古い 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
いいえ、違います。
本当に欲しい場合は、入手する方法があります (C を使用する、スタンドアロンのものを使用するなど)。ただし、私はそれに反対します。それを持たないことは、意図的な設計上の決定でした。プリプロセッサの全体的なアイデアは非常に非エイダです。
C のプリプロセッサが使用されることのほとんどは、他のより信頼性の高い方法で Ada で実現できます。唯一の大きな例外は、クロスプラットフォーム サポートのためにソース ファイルにマイナーな変更を加えることです。これが典型的なクロスプラットフォームの C プログラムでどれだけ悪用されているかを考えると、Ada でサポートされていないことには満足しています。ほとんどの C/C++ 開発者は、変更を「マイナー」に保つのに十分なほど自分自身を制御できます。結果は機能する可能性がありますが、多くの場合、人間が読み取ることはほぼ不可能です。
これを達成する典型的な Ada の方法は、異なるコードを異なるファイルに配置し、コンパイル時にビルド システムを使用して何らかの方法で選択することです。Make は、これを行うのに十分なほど強力です。