{$ ifdef}でテストされたシンボルをどこで定義しますか?
-
13-10-2019 - |
質問
次のようなコードでdelphiディレクティブを使用する場合:
{$IFDEF something}
.
.
.
{$ENDIF}
プロジェクトの「何か」という言葉はどこに割り当てますか?プロジェクトオプションの一部の場所で試しましたが、うまくいきませんでした。正しいものが見つからなかったと思います。
解決
それはにあります 条件付き定義 プロジェクトの下のスロット| d2010でこのように見えるオプション:
他のヒント
他の答えは、シンボルとさまざまなアプローチの範囲の意味を定義する場所にあなたを指摘しています。
ただし、誰もまだ言及していないのは、定義シンボルを変更する場合、コードに影響を与えるためにプロジェクトの完全なビルドを行う必要があるということです。
「コンパイル」すると、Delphiコンパイラは、以前のコンパイル以降に変更されたユニットのみをコンパイルします。定義シンボルを変更した場合、これはプロジェクトユニットを変更しないため、ユニットが再コンパイルされていない場合、定義シンボルの変更はそれらのユニットに効果がありません。
すべてのユニットに適用される定義シンボルの変更を強制するには、コンパイルではなく「ビルド」する必要があります。
これは、あなたの設定の試みが定義する理由を説明するかもしれません
{$ defineでそれらを定義することもできますu003Csymbol>}ディレクティブ。どのような変更が範囲です。 aを定義するときu003Csymbol>プロジェクトオプションで条件付き定義では、スコープはプロジェクト全体のグローバルです。 $定義ディレクティブは、現在のモジュールの最後まで宣言されているポイントから、または同じものを使用した$ UNDEFディレクティブまでのみ有効です。u003Csymbol>遭遇します。使用するものは、ニーズとIFDEFが何をするかによって異なります。
プロジェクトのすべてのユニットで使用される条件付き定義を配置できる2つの場所があります。
- プロジェクトオプションで(David Heffernanがすでに言ったように)
- 含まれているファイルを含む すべて これらのユニットの
なぜ2番目のオプションに言及するのですか? verxxx条件付き定義と1に与えられたその他の条件付き定義に基づいた専門的な処理が可能になるため、例についてはjedi.inc(jedi jclから)を参照してください。
また、Delticsが言ったように、どのユニットを再コンパイルするユニットを決定すると、コンパイラはユニット自体が変更されたかどうかのみをチェックします。したがって、条件付き定義を変更する場合、再コンパイルだけでなく、再構築を行う必要があります。 Delphiコンパイラは非常に高速であるため、幸いなことに、コンパイル時間に大きな違いはありません。
.inc拡張機能を備えた外部ファイルでグローバルシンボルを定義できます。新しいテキストファイルを作成し、定義するすべてのものに入れて、たとえばpredefines.incのように保存します:
---ファイルpredefines.incのコンテンツ---
{$DEFINE Symbol}
{$IFDEF Symbol}
{$DEFINE AnotherSymbol}
{$ENDIF}
Delphiモジュールでは、確認する必要があります。記号が定義されています。このコードをインターフェイスセクションに配置します。
interface
{$I Predefines.inc}
uses ...
// Check you defines
{$IFDEF Symbol}
...
{$ENDIF}