OPTIONS オプションは、ステートメント PACKAGE、PROCEDURE、 ENTRY および BEGIN に指定することができます。 OPTIONS 属性は、ENTRY 宣言で指定することができます。 これは、ブロックやプロシージャーの呼び出しに適用する処理の特性を指定するために使用されます。 以下の構文図に示されているオプションは、英字順に リストされており、*** ページから説明されています。
オプションは、ブランクまたはコンマで区切られます。 これらは、任意の順番に示すことができます。
このオプションは NODESCRIPTOR と同じ効果があります。
プロシージャーに ASSEMBLER オプションがある場合、そのプロシージャーの終了によって、 PLIRETV() 値が、そのプロシージャーの戻り値として使用されます。
詳細については、「プログラミング・ガイド」を参照してください。
BYVALUE は、既知の長さとサイズを持つスカラー引数および スカラー・パラメーターに対してのみ指定できます。
BYVALUE および BYADDR 属性は、入り口宣言の記述子リスト、 およびパラメーター宣言の属性リスト内にも指定することができます。 入り口またはパラメーター宣言に BYVALUE または BYADDR を指定すると、OPTIONS ステートメントに指定されたオプションが無効になります。
以下の例では、入り口宣言と OPTIONS オプションの 両方に BYVALUE および BYADDR を表しています。 例では、コンパイラー・オプション DEFAULT (BYADDR) が有効であると想定しています。
例 1
MAINPR: proc options(main);
dcl D entry (fixed bin byaddr,
ptr,
char(4) byvalue) /* byvalue not needed */
options(byvalue);
dcl E2 entry; /* default(byaddr) in effect */
dcl Length fixed bin,
P pointer,
Name char(4);
call D(Length, P, Name); /* Length is passed byaddr */
/* P is passed by value */
/* Name is passed by value */
call E2(P); /* P is passed by address */
D: proc(I, Q, C)
options(byvalue);
dcl I fixed bin byaddr,
Q ptr,
C char(4) byvalue;
E2: proc(Q);
dcl Q ptr;
例 2
dcl F entry (fixed bin byaddr, /* byaddr not needed */
ptr,
char(4) byvalue)
options(byaddr);
dcl E3 entry;
dcl E4 entry (fixed bin byvalue);
call F(Length, P, Name); /* Length is passed byaddr */
/* P is passed byaddr */
/* Name is passed by value */
call E3(Name); /* Name is passed byaddr */
call E4(Length); /* Length is passed by value */
F: proc(I,P,C) options(byaddr);
dcl I fixed bin byaddr; /* byaddr not needed */
dcl P ptr byaddr; /* byaddr not needed */
dcl C char(4) byvalue; /* byvalue needed */
E3: proc(L);
dcl L char(4);
E4: proc(N);
dcl N fixed bin byvalue;
外部プロシージャーの省略形は、NOCHARG です。 内部プロシージャーと開始ブロックは、それらが含まれているプロシージャーからデフォルトを継承します。
CHARG が有効な場合には、以下のようなセマンティックの変更が起こります。
Name: procedure options(chargraphic);
dcl A char(5);
dcl B char(8);
/* the following statement... */
(stringsize): A=B;
/*...is logically transformed into... */
A=mpstr(B,'vs',length(A));
NOCHARG が有効な場合は、セマンティックの変更は起こりません。
DESCRIPTOR が示される場合、必要に応じてコンパイラーは記述子を渡します。
NODESCRIPTOR が示される場合には、コンパイラーは記述子を渡しません。
上記のどちらも表示されない場合には、呼び出されたプロシージャーの いずれかのパラメーターがストリング、配列、区域、構造体、または共用体であるときだけ、DESCRIPTOR が想定されます。
いずれかのパラメーターまたはエレメントが、以下の条件に当てはまっている 場合、プロシージャー・ステートメントまたは入り口宣言に NODESCRIPTOR があると、エラーになります。
ただし、範囲が指定されていないパラメーターが NONASSIGNABLE VARYING または VARYINGZ ストリングの場合は、NODESCRIPTOR を利用できます。
DLLINTERNAL 属性は、EXTERNAL プロシージャーまたは ENTRY でのみ有効です。
FETCHABLE 属性は、INTERNAL プロシージャーでは無効です。
FETCHABLE プロシージャーは、MAIN プロシージャーが含まれるロード・モジュール にはリンクしないでください。
INLINE は、開始ブロックまたはプロシージャーがパッケージ内で 呼び出されたとき、その開始ブロックまたはプロシージャーのコードが 呼び出し点でインライン で実行されることを示します。 INLINE が指定されていても、コンパイラーは、開始ブロックまたは プロシージャーをインラインとしないように選択することができます。
NOINLINE は、開始ブロックまたはプロシージャーがいかなる場合にも インラインで実行されないように指示します。
OPTIONS(INLINE) を使用すれば、 適切に構造化された読みやすいコードを書くのが容易になります。 例えば、プログラムをプロシージャーのセットへの一連の呼び出しとして 作成した場合、OPTIONS(INLINE) を使えば、 これらのプロシージャーを 1 つ 1 つ呼び出す必要がなくなり、 オーバーヘッドが少なくなります。
プロシージャーまたは開始ブロックをインラインで実行すると、ONLOC などの組み込み関数によって戻される値は、 その関数がインライン化されているプロシージャーの名前を戻します。 同様に、トレースバックされた情報には、 呼び出されたプロシージャーは含まれません。
インライン化できないプロシージャーと開始ブロックがあります。 以下のものを含めますが、これらに限定することはありません。
INLINE オプションを指定したネストされないプロシージャーが 外部ではなく参照もされない場合、 このプロシージャーのためのコードは作成されません。 INLINE も NOINLINE も指定されていないプロシージャーについては、 DEFAULT コンパイラー・オプションがオプションをセットします。
INLINE と NOINLINE の詳しい使用法については、「プログラミング・ガイド」を参照してください。
呼び出し規則の詳細については、「プログラミング・ガイド」を参照してください。
OPTIONS(MAIN) を指定した、 複数のプロシージャーを含んでいる PL/I プログラムは、 予測できない結果を生じることがあります。
各オプション引数リストは、適用するオプションのパラメーターを指定します。 パラメーターは、どのような順番でも表示でき、コンマまたはブランクによって分離することができます。 オプション用の引数リストがない場合、項目名のすべてのパラメーターはデフォルト・リストになります。
NOMAP、NOMAPIN、または NOMAPOUT は、同一の OPTION 指定にすべて表示 することができます。 この指定は、複数の指定またはデフォルト引数リストの同一パ ラメーターに含まれてはなりません。
これらのオプションは受け入れられますが、COBOL オプションが適用されない限りは無視されます。
ORDER は、ブロック内で修正された変数の最も新しく 割り当てられた値だけが入力される ON ユニットで 利用できることを示します。これは、ステートメントの 実行時およびブロック内の式で計算条件が生じたためです。
REORDER オプションを指定すると、コンパイラーが最適化コードを生成し、エラー・フリーの実行があった場合に、ソース・プログラムに指定された結果を生成することができます。
ORDER と REORDER オプションの詳細については、 「プログラミング・ガイド」を参照してください。
上記のオプションが両方とも外部プロシージャーに指定されない場合には、 デフォルトとして DEFAULT コンパイラー・オプションがセットされます。 内部ブロックは、含まれているブロックから ORDER または REORDER を継承します。
REDUCIBLE は、引数 (1 つまたは複数) が変更されない限り、 プロシージャーまたは入り口を複数回呼び出す必要がないこと、 およびプロシージャーの呼び出しに副次作用がないことを示します。
例えば、変更されないデータに基づいて結果を計算するユーザー作成の 関数には、REDUCIBLE が宣言されなければなりません。 乱数や時刻などの、変更されるデータに基づいて結果を計算する 関数は、IRREDUCIBLE として宣言する必要があります。

このオプションは、 自動的に LINKAGE(STDCALL) および EXT('WinMain') を暗黙指定します。 関連ルーチンには、以下の 4 つのパラメーターを含める必要があります。
これらは、C WinMain が予期する 4 つのパラメーターと同じであり、 このルーチンからの呼び出しは、C ルーチンが予期するものと同じです。
