INTERNAL 属性と EXTERNAL 属性は、名前の有効範囲を指定します。
|
省略形: INTERNAL は INT、EXTERNAL は EXT
この指定により、宣言中の名前は実質的に内部となり、コンパイル単位の外側では認識されなくなります。 宣言中の名前の代わりに環境名が知られるようになります。
環境名は文字ストリング定数でなければならず、 大文字への変換なしにそのまま使用されます。
以下に例を示します。
dcl X entry external ('koala');
環境名を区切り文字 (_) で開始することは避けてください。 下線文字で開始される名前は、ライブラリー用として予約されています。
リンカーが環境名を修飾するプラットフォームでは、外部属性を持つ 環境名を指定しても、その名前が変数名と大文字/ 小文字の違いしかない場合は、 その環境名は修飾されます。 次の宣言では、
dcl abc ext('kLm'), xyz ext('xYz' );xyz の名前が修飾されます。 環境名の装飾について詳しくは、PL/I for Windows の 「プログラミング・ガイド」の「呼び出し規則」という章の「リンケージに関する考慮事項」を参照してください。
INTERNAL は、内部プロシージャーの入り口名および他のすべての変数 (入り口定数、ファイル定数、およびプログラマー定義の条件を除く) のデフォルトです。 INTERNAL は、その名前が、それを宣言しているブロック内でだけ認識されることを指定します。 別の場所で同じ名前を明示的に宣言すると、別の有効範囲を持つ新しい オブジェクトを参照することになります。これらの 2 つの有効範囲は 相互に重なることはありません。
EXTERNAL は、ファイル定数、(内部プロシージャー以外の) 入り口定数、およびプログラマー定義の条件のデフォルトです。 EXTERNAL 属性を持つ名前は、別々の外部プロシージャー内で、または外部プロシージャーに含まれているブロック内で複数回宣言することができます。 EXTERNAL 属性を持つ同じ名前を 2 回以上宣言した場合、それらの宣言はすべて同じデータを参照します。 EXTERNAL 属性を持つ名前の各宣言の有効範囲は、 そのアプリケーション内でのその名前 (EXTERNAL 属性を持つもの) の すべての宣言の有効範囲を包含します。
大構造体または共用体の名前を複数のブロックで EXTERNAL として 宣言する場合、対応するメンバー名は異なっていてもかまいませんが、 メンバーの属性は同じでなければなりません。
次に例を示します。
ProcA: procedure; declare 1 A external, 2 B, 2 C;
·
·
·
end ProcA; %process; ProcB: procedure; declare 1 A external, 2 B, 2 D;
·
·
·
end ProcB;
A.B が ProcA 内で変換されると、 それは ProcB についても変換され、逆の場合も同様です。 A.C が ProcA 内で変換されると、 A.D は ProcB について変換され、逆の場合も同様です。
構造体と共用体のメンバーは、常に INTERNAL 属性を持ちます。
同じ名前の外部宣言はすべて同じデータを共用するため、それらの宣言の結果はすべて同じセットの属性にならなければなりません。 EXTERNAL の名前が別の外部プロシージャーで宣言されるときは、 ユーザーは属性が確実に一致するようにしなければなりません。図 9 は、さまざまな宣言とその有効範囲を説明しています。
Scope_Example: package exports(*); 1 A: procedure; 2 declare S character (20); 7 dcl Set entry(fixed decimal(1)), 7 Out entry(label); call Set (3); 9 E: get list (S,M,N); 8 B: begin; 4,5 declare X(M,N), Y(M); get list (X,Y); call C(X,Y);
9,5 C: procedure (P,Q); declare P(*,*), Q(*), 12,2 S binary fixed external; S = 0; 6 do I = 1 to M; if sum (P(I,*)) = Q(I) then 8 go to B; S = S+1; if S = 3 then 9 call Out (E); Call D(I); 8 B: end; end C;
9 D: procedure (N); put list ('Error in row ', 2,3 N, 'Table Name ', S); end D; end B; go to E; end A; 9 Out: procedure (R); Declare R Label, 11 (K static internal, 11,7 L static external) init (0), 12 S binary fixed external, Z fixed decimal(1); K = K+1; S=0; if K<L then stop; 10 else go to R; end; Set: procedure (Z); declare Z fixed dec(1); 7 L=Z; declare L external init(0); return; end; end Scope_Example;
GET ステートメントと PUT ステートメントにはファイルが 指定されていないため、SYSIN と SYSPRINT は 暗黙宣言されていることに注意してください。