Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.8, 言語解説書

宣言の有効範囲

名前の適用対象となるプログラム部分は、 その名前についての宣言の有効範囲 と呼ばれます。 ほとんどの場合、名前の宣言の有効範囲は、プログラム内で 名前が宣言される位置によって完全に決定されます。 暗黙宣言は、名前が外部プロシージャーの PROCEDURE ステートメントの 直後にある DECLARE ステートメントで宣言されたものと見なされます。

名前がプログラム全体に対して同じ意味を持つ必要はありません。 ブロック内で明示的に宣言された名前は、そのブロック内だけで意味を持ちます。 そのブロックの外部では、同じ名前がそこでも宣言されていない限りその名前は認識されません。 名前を宣言するたびに、その有効範囲が確立されます。この場合、その外側ブロック内の名前は、別のデータ項目を参照することになります。 このため、ローカル定義を指定することにより、プログラムのほかの部分で使用されているすべての名前を知らなくても、プロシージャーまたは開始ブロックを作成することが可能になります。

下記の例で、A の実際の出力は C.A、 つまり 2 です。 B の出力は、プロシージャー X で 宣言されたとおり 1 です。

  X: proc options(main);
    dcl (A,B) char(1) init('1');
    call Y;
    return;

    Y: proc;
      dcl 1 C,
          3 A char(1) init('2');
      put data(A,B);
      return;
    end Y;
  end X;

したがって、ネストされたプロシージャーでは、 PL/I は現行ブロック内に宣言された変数を使用してから、 包含ブロックで宣言された変数を使用することになります。

名前の宣言の有効範囲を理解するためには、 包含された および内部にある という 2 つの 用語を理解しなければなりません。

PACKAGE、PROCEDURE、または BEGIN ステートメントから、 それに対応する END ステートメント (BEGIN、PACKAGE、 および PROCEDURE ステートメントの条件接頭語も含む) までの 間にあるブロックの全テキストは、そのブロックに包含されると 見なされます。 ただし、ブロックに適用する任意の ENTRY ステートメントのラベルと同様に、ブロックの先頭にある BEGIN または PROCEDURE ステートメントのラベルは、そのブロックに含まれません。 ネストされたブロックは、それらを包むブロックに包含されます。

ブロックに包含されるテキストのうち、そのブロック内の ネストされているほかのブロックに包含されていないものは、 そのブロックの内部にあると見なされます。 プロシージャーの入り口名 (および BEGIN ステートメントのラベル) は、そのブロックに含まれません。 したがって、プロシージャーの入り口名は、包含ブロックの内部にあることになります。 外部プロシージャーの入り口名は、その外部プロシージャーの外部にあると見なされます。

図 7 は、データ宣言の有効範囲を示しています。

図 7. データ宣言の有効範囲
データ宣言の有効範囲

左方の大括弧はブロック構造体を示しています。右方の大括弧は名前の各宣言の有効範囲を示しています。 QR の 2 つの宣言の有効範囲は、 QQ'、 および RR' となっています。

XY は、 パッケージに包含されるすべてのプロシージャーにとって可視となっています。

 1 
P はブロック A で宣言され、 再宣言されていないため、A 全体で認識されます。
 2 
Q はブロック A で宣言され、 さらにブロック B で再宣言されています。 Q の最初の宣言の有効範囲は、 B を除く A のすべてです。 Q の 2 番目の宣言の有効範囲は、 ブロック B のみです。
 3 
R はブロック C で宣言されていますが、 R への参照がブロック B で行われています。 ブロック B での R への参照により、 外部プロシージャーの AR の暗黙宣言が行われます。 したがって、異なる有効範囲を持つ 2 つの別個の 名前 (図 7RR') が 存在することになります。 明示的に宣言された R の有効範囲は、 ブロック C です。 ブロック B 内の暗黙的に 宣言された R の有効範囲は、 ブロック C を除く A のすべてです。
 4 
I はブロック C で参照されています。 このため、外部プロシージャー A で 暗黙宣言されていることになります。 この結果、包含されたプロシージャー BC、 および D を含むすべての A に宣言が適用されます。
 5 
S はプロシージャー D で明示的に宣言され、 D の内部でのみ認識されます。

図 8 は、入り口定数とステートメント・ラベルの宣言の有効範囲を示しています。

図 8. 入り口およびラベル宣言の有効範囲
入り口およびラベル宣言の有効範囲

図 8 は、外部プロシージャーの AE を 示しています。

 1 
名前 A の宣言の有効範囲は、ブロック A のすべてに 限られており、E は有効範囲ではありません。
 2 
EA で外部入り口定数として明示的に宣言されています。 E の明示宣言は、ブロック A の全体に適用されます。 ブロック E 全体に適用される E の明示宣言にはリンクしていません。 名前 E の宣言の有効範囲は、ブロック A の 全体とブロック E の全体です。
 3 
ラベル L1 は、AC の 内部のステートメントに示されています。 その結果、2 つの別々の宣言が確立されます。 最初のものは、ブロック C を除くブロック A の すべてに適用され、2 番目のものはブロック C にのみ適用されます。 したがって、ブロック B の GO TO ステートメントが実行されると、 制御はブロック AL1 に移され、 ブロック B は終了します。
 4 
DB は、 明示的にブロック A 内で宣言され、 A 内の任意の場所で参照することができます。 ただし、それらは INTERNAL であり、 ブロック E 内で参照することはできません。
 5 
CB で明示的に宣言され、 B の内部から参照できますが、B の外側からは参照できません。
 6 
L2B で宣言され、 ブロック B、および B に 包含される C で参照できますが、 B の外側からは参照できません。

Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)