2013-03-15 11 views
7

私は大きなユニットで作業しています。ユニットが大きくなって3ユニットに分割することにしました。これらのユニット名がMain,CommonObjectsであるとします。 Mainユニットは他の2つのユニットを使用し、ObjectsユニットもCommonユニットを使用します。これらの条件を参照する必要があるすべての3つのユニットにコードがあります。ユニットに条件文を定義し、それを他のユニットで使用できますか?

問題は、これらの条件を3つのユニットのどれに定義しても、他の2つのユニットがそれらを見ないことです。私は確かに3つのすべてのユニットでそれらをコピーしたくありません。これらのユニットは複数のプロジェクトで使用されるため、プロジェクトで定義する必要はありません。その場合は、これを使用するすべてのプロジェクトで条件を気にする必要はありません。

3つのユニットすべてがそれらをプロジェクトで定義することなく表示する方法でこれらの条件を定義できますか?

+3

インクルードファイルを使用することがあります。 – TLama

+0

+1。私はプロジェクトファイルにそれらを入れて異論を理解していない。それがあれば、ユニットを使用する他のプロジェクトには影響しません(コンパイルされた.dcuファイルではなくユニットを使用している限り)。プロジェクトファイル内の定義は、定義が適用されます。ユニットを使用している他のプロジェクトは、定義について何も知らず、何も影響を与えずにユニットをコンパイルします。ただし、インクルードファイルに入れる場合は、コンパイルする前にインクルードファイルを適切に変更することが他のプロジェクトで分かっていなければなりません。 –

+0

@Kenこれらのユニットを使用しているプロジェクトが何であっても、すべてのプロジェクトは同じ条件を想定し、それらについて心配する必要がないからです。例えば、10の異なるプロジェクトは、おそらく同じ厳密な条件を必要とするでしょう。また、私は定義する必要がある12の条件があります。私は、これらの条件が存在することさえ知り得ない理由がないときに、エンド・デベロッパーがプロジェクト内の12のすべてを定義することを期待していません。 –

答えて

8

条件付き定義の唯一のオプションは、それらを3つのすべてのユニットに含める.incファイルに入れることです。

ただし、条件付き定義を実現する唯一の方法は、$IFDEFではありません。条件の代わりにブール値定数を使用することを検討することもできます。 3つのユニットすべてに表示されている限り、$IFDEFではなく$IFを使用できます。

{$IF MyConstant} 
    .... 
{$IFEND} 

あるいは、XE3で始まる、あなたは{$ENDIF}{$IF}を終了することができます。

個人的には、私は条件付きでコンパイルしようとしたときにこの後者の方法を好む傾向があり、条件にグローバルスコープを持たせたくありません。

+0

このようなサウンドは確かに唯一の解決策です。ありがとう! –

+0

私は '{$ IF MyConstant}'アプローチが好きです。あなたは 'MyConstant'に何を使う傾向がありますか? Btw、なぜあなたの条件にグローバルな範囲を持たせたくないのですか?言い換えれば、単に条件付きコンパイルを使用しているものに興味があります。私は現在、古いバージョンのソフトウェアに対してコンパイラのバージョンの互換性を保証することを除いて、すべてのパスで「条件なし」となっています。 –

+0

@MarjanVenema通常、パフォーマンスの問題から標準ビルドにコンパイルできない診断/デバッグコード用です。ご存知のように、プロジェクトファイルに干渉しないようにしてください。ソースコードのローカルな変更は不透明ではありません。 –

関連する問題