OPTIONAL は、パラメーター記述子リストの一部として、またはパラメーター宣言の属性として指定することができます。
|
引数にアスタリスクを指定することによって、 OPTIONAL 引数を呼び出しおよび関数参照で省略することができます。 引数リストのどの位置にある項目でも (最後の項目でも構わない) 省くことができます。 ただし、省略される項目は引数として数えられます。 入り口にその項目が含まれていても、 引数の数は入り口で許可されている最大数を超えてはなりません。
項目が LIMITED ENTRY ではない限りは、同じ項目に OPTIONAL と BYVALUE は使用できません。
受け取りプロシージャーは、OMITTED 組み込み関数を使用して、 OPTIONAL パラメーター/引数が入り口の呼び出しで省略されたかどうかを 判別することができます。 (OMITTED 組み込み関数についての詳細は、OMITTEDを参照してください。)
ENTRY 宣言の最終パラメーターが OPTIONAL として宣言された場合、その ENTRY はそれらのパラメーターを完全に省略して呼び出すことができます。該当する数のアスタリスクを指定することも不要です。 そのため、例えば、ある ENTRY が 5 つのパラメーターを持っていて、そのうち最後の 2 つは OPTIONAL 属性を持っていると宣言された場合、3 つ、4 つ、または 5 つの引数を指定して呼び出すことができます。
呼び出された ENTRY が明示的に宣言されている場合、および呼び出された ENTRY がネストされたサブプロシージャーである場合には、そのような末尾の OPTIONAL パラメーターを省略できます。 なお、ENTRY に OPTIONS(ASSEMBLER) 属性が指定されていない限り、生成されたコードでは、省略したパラメーターに NULL ポインターが入ります。
図 5 では、プロシージャー Vrtn に対して 有効な CALL ステートメントと無効な CALL ステートメントの両方を示します。
Caller: proc;
dcl Vrtn entry (
fixed bin,
ptr optional,
float,
* optional);
/* The following calls are valid: */
call Vrtn(10, *, 15.5, 'abcd');
call Vrtn(10, *, 15.5, *);
call Vrtn(10, addr(x), 15.5, *);
call Vrtn(10, *, 15.5);
call Vrtn(10, addr(x), 15.5);
/* The following calls are invalid: */
call Vrtn(*, addr(x));
call Vrtn(10,addr(x));
call Vrtn(10);
call Vrtn;
end Caller;
Vrtn: proc (Fb, P, Fl, C1);
dcl Fb fixed bin,
P ptr optional,
Fl float,
C1 char(8) optional;
if ¬omitted(C1) then display (C1);
if ¬omitted(P) then P=P+10;
end;Vrtn は、OPTIONAL パラメーターが省略されたかどうかを判別して、適切な処置をとります。