Skip to main content

#define

マクロを定義します。

説明

このマクロ・プリプロセッサ指示文はマクロを定義します。以下の形式をとります。

#define Macro[(Args)] [Value]

以下はその説明です。

  • Macro は、定義されるマクロの名前です。有効なマクロ名は、英数字文字列です。

  • Args (オプション) は、マクロが受け入れる 1 つ以上の引数です。これらは、(arg1, arg2, ...) の形式をとります。マクロの引数を指定する各変数の名前は、パーセント符号で始まる必要があります。引数の値にコンマを含めることはできません。

  • Value (オプション) は、マクロに割り当てられる値です。この値には、任意の有効な ObjectScript コードを指定できます。リテラルなどの単純な値にすることも、式などの複雑な値にすることもできます。

マクロが値付きで定義されている場合、その値によって ObjectScript コード内のマクロが置き換えられます。値を持たないマクロを定義すると、コードでは他のプリプロセッサ指示文を使用して、そのマクロが存在するかどうかをテストし、その結果に応じてアクションを実行できます。

##continue を使用すると、#define 指示文を次の行に継続できます。##; を使用すると、#define 行にコメントを追加できます。ただし、##continue と ##; を同じ行で使用することはできません。

値付きのマクロ

値付きのマクロは、ObjectScript コード内で単純なテキストを置き換える機能を提供します。ObjectScript コンパイラがマクロの呼び出し ($$$MacroName の形式で) に遭遇するたびに、ObjectScript コードの現在の位置で、マクロに指定されている値が置き換えられます。マクロの値は、任意の有効な ObjectScript コードにできます。これには以下が含まれます。

  • 文字列

  • 数値

  • クラス・プロパティ

  • メソッド、関数、または他のコードの呼び出し

マクロの引数にコンマを含めることはできません。コンマが必要な場合は、#def1arg 指示文を使用できます。

以下は、さまざまな方法で使用されるマクロの定義の例です。

#define Macro1 22
#define Macro2 "Wilma"
#define Macro3 x+y
#define Macro4 $Length(x)
#define Macro5 film.Title
#define Macro6 +$h
#define Macro7 SET x = 4
#define Macro8 DO ##class(%Library.PopulateUtils).Name()
#define Macro9 READ !,"Name: ",name  WRITE !,"Nice to meet you, ",name,!

#define Macro1A(%x) 22+%x
#define Macro2A(%x) "Wilma" _ ": %x"
#define Macro3A(%x) (x+y)*%x
#define Macro4A(%x) $Length(x) + $Length(%x)
#define Macro5A(%x) film.Title _ ": " _ film.%x
#define Macro6A(%x) +$h - %x
#define Macro7A(%x) SET x = 4+%x
#define Macro8A(%x) DO ##class(%Library.PopulateUtils).Name(%x) 
#define Macro9A(%x) READ !,"Name: ",name  WRITE !,"%x ",name,!
#define Macro9B(%x,%y) READ !,"Name: ",name  WRITE !,"%x %y",name,!

マクロの値の規則

マクロは任意の値を持つことができますが、マクロをリテラル式または完全な実行可能な行とすることが規則です。例えば、以下は有効な ObjectScript の構文です。

#define Macro7 SET x =

ここで、マクロは以下のようなコードで呼び出される可能性があります。

 $$$Macro7 22

プリプロセッサは、以下のコードに展開します。

 SET x = 22

これは、明らかに有効な ObjectScript 構文ですが、このようにマクロを使用することはお勧めしません。

値なしのマクロ

マクロは、値なしに定義できます。この場合、マクロの存在 (または存在しないこと) は、特定の条件が存在することを指定します。次に、他のプリプロセッサ指示文を使用して、マクロが存在するかどうかをテストし、その結果に従ってアクションを実行できます。例えば、Unicode 実行可能プログラムまたは 8 ビット実行可能プログラムのいずれかとしてアプリケーションがコンパイルされる場合、以下のようなコードとなる可能性があります。

#define Unicode

#ifDef Unicode
   // perform actions here to compile a Unicode
   // version of a program
#else
   // perform actions here to compile an 8-bit
   // version of a program
#endif

JSON エスケープ円記号の制限

マクロは、\" エスケープ規則が含まれる JSON 文字列を受け入れません。マクロ値または引数は、リテラル円記号に JSON \" エスケープ・シーケンスを使用できません。このエスケープ・シーケンスは、マクロの本文またはマクロ拡張に渡される仮引数で使用することは認められていません。代わりに、\" エスケープを \u0022 に変換できます。この代わりの方法は、キー名と要素値の両方として使用される JSON 構文文字列に有効です。リテラル円記号が含まれる JSON 文字列が、JSON 配列または JSON オブジェクトの要素値として使用される場合は、別の方法として、\" が含まれる JSON 文字列を、同じ文字列値に評価する ObjectScript 文字列式に置き換えることができます。この文字列は括弧で囲む必要があります。

FeedbackOpens in a new tab