文と属性:モジュール内の言語要素がモジュール自身内のみから参照できるように指定します。
PRIVATE 属性は,型宣言文か,PRIVATE 文で指定することができ,以下のいずれかの形式を取ります。
形式
型宣言文
type, [att-ls,] PRIVATE [,att-ls] :: entity [,entity]...
文
PRIVATE [[::] entity [,entity]...]
type
データ型指定子。
att-ls
省略可能な属性指定子並び。
entity
以下のいずれか。
変数名
手続名
構造型名
名前付き定数
変数群要素
文形式では,言語要素は総称識別子 (総称名,ユーザー定義演算子,またはユーザー定義代入) であってもかまいません。
規則と振る舞い
PRIVATE 属性は,モジュールの有効域中でしか使用できません。
1 つのモジュールの有効域では,言語要素並びを持たない PRIVATE 文は 1 回しか指定できません。このような文は,モジュール内のすべての言語要素の基本参照許可を設定します。
モジュール内で PRIVATE 文が指定されていない場合,基本参照許可は PUBLIC となります。PUBLIC の参照許可を持つ言語要素には,USE 文を使って,モジュールの外から参照することができます。
構造型がモジュール内で PRIVATE として宣言されていると,その成分も PRIVATE となります。構造型とその成分は,それを定義しているモジュールの中では,参照結合を通して任意の副プログラムから参照することはできますが,モジュールの外から参照することはできません。
構造型がモジュール内で PUBLIC として宣言されているが,その成分が PRIVATE として宣言されている場合,参照結合 (または親子結合) を通してモジュールを参照している任意の有効域は構造型定義を参照できます。ただし,その成分は参照できません。
モジュール手続が,PRIVATE の参照許可を持つ型の仮引数または関数結果を持っている場合,モジュール手続は PRIVATE の参照許可を持っていなくてはなりません。モジュールが総称識別子を持っている場合,それも PRIVATE として宣言されなくてはなりません。
手続が総称識別子を持っている場合,手続の特定の名前の参照許可は,その総称識別子の参照許可からは独立しています。一方を PRIVATE として宣言し,もう一方を PUBLIC として宣言することができます。
互換性
CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB
関連情報
PUBLIC,MODULE,TYPE,USE,型宣言,参照結合と親子結合,属性の互換性,手続の総称名の定義
例
以下の例は,PUBLIC および PRIVATE 属性を指定する型宣言文を示しています。
REAL, PRIVATE :: A, B, C INTEGER, PUBLIC :: LOCAL_SUMS
次に PUBLIC および PRIVATE 文の例を示します。
MODULE SOME_DATA REAL ALL_B PUBLIC ALL_B TYPE RESTRICTED_DATA REAL LOCAL_C DIMENSION LOCAL_C(50) END TYPE RESTRICTED_DATA PRIVATE RESTRICTED_DATA END MODULE
次の構造型宣言文は,型がモジュール内に制限されていることを示しています。
TYPE, PRIVATE :: DATA ... END TYPE DATA
次の例は,PRIVATE 成分を持つ PUBLIC 型を示しています。
MODULE MATTER TYPE ELEMENTS PRIVATE INTEGER C, D END TYPE ... END MODULE MATTER
この例では,成分 C と D は型 ELEMENTS に対して非公開ですが,型 ELEMENTS はモジュール MATTER に対して非公開ではありません。モジュール MATTER を使用する任意のプログラム単位は,型 ELEMENTS の変数を宣言し,型 ELEMENTS の引数値として渡すことができます。
以下に別の例を示します。
! モジュール VECTRLEN 内の LENGTH は,2 次元ベクトルの長さを計算します。 ! モジュールは,PRIVATE と PUBLIC の両方の手続が含まれています。 MODULE VECTRLEN PRIVATE SQUARE PUBLIC LENGTH CONTAINS SUBROUTINE LENGTH(x,y,z) REAL,INTENT(IN) x,y REAL,INTENT(OUT) z CALL SQUARE(x,y) z = SQRT(x + y) RETURN END SUBROUTINE SUBROUTINE SQUARE(x1,y1) REAL x1,y1 x1 = x1**2 y1 = y1**2 RETURN END SUBROUTINE END MODULE