Skip to main content

##unique

コンパイル時または実行時に使用するマクロ定義内に、新規で一意のローカル変数を作成します。

説明

このマクロ・プリプロセッサ関数は、コンパイル時または実行時に使用するマクロ定義内に、新規で一意のローカル変数を作成します。このプリプロセッサ関数は、#define 呼び出しまたは #def1arg 呼び出しの一部としてのみ使用できます。以下の形式をとります。

 ##unique(new)
 ##unique(old)

ここで、new は、新しい一意の変数の作成を指定し、old は、その同じ変数への参照を指定します。

SET ##unique(new) によって作成される変数は %mmmu1 という名前のローカル変数です。後続の SET ##unique(new) では、%mmmu2、%mmmu3、以降同様の名前のローカル変数が作成されます。これらのローカル変数は、すべての % ローカル変数と同じ有効範囲ルール (% 変数は常にパブリック変数です) に従います。これらは、あらゆるローカル変数と同様に、ZWRITE を使用して表示でき、引数なしの KILL を使用して削除できます。

ユーザ・コードは他の ObjectScript 変数を参照できるように、##unique(old) 変数を参照できます。##unique(old) 構文は、作成された変数を参照するために、何度でも使用できます。

その後 ##unique(new) を呼び出すと、新しい変数が作成されます。##unique(new) を再度呼び出した後に ##unique(old) を呼び出すと、次に作成された変数が参照されます。

例えば、以下のコードは、##unique(new)##unique(old) を使用して、2 つの変数の値を互いに入れ替えます。

 #define Switch(%a,%b) SET ##unique(new)=%a, %a=%b, %b=##unique(old)
 READ "First variable value? ",first,!
 READ "Second variable value? ",second,!
 $$$Switch(first,second)
 WRITE "The first value is now ",first," and the second is now ",second,!

これらの変数の一意性を維持するには、以下のようにします。

  • #define または #def1arg プリプロセッサ指示文の外側に ##unique(new) を設定しようとしない。

  • メソッドまたはプロシージャにあるプリプロセッサ指示文に ##unique(new) を設定しない。これらはメソッド (%mmmu1) に固有の変数名を生成しますが、これは % 変数であるため、グローバルに有効範囲が設定されます。##unique(new) を設定する別のメソッドを呼び出しても %mmmu1 が作成され、最初のメソッドで作成された変数が上書きされます。

  • %mmmu1 変数を直接設定しない。InterSystems IRIS は、システムで使用するためにすべての % 変数 (%z 変数および %Z 変数を除く) を予約しています。これらをユーザ・コードで設定しないでください。

FeedbackOpens in a new tab