目的
USE ステートメントは、モジュールの共通エンティティーへのローカル・アクセスを可能にするモジュール参照です。
構文
>>-USE--module_name--+---------------------------+------------->< +-,--rename_list------------+ '-,--ONLY--:--+-----------+-' '-only_list-' |
規則
USE ステートメントは、specification_part の中の他のすべてのステートメントより前の位置にのみ指定できます。 1 つの有効範囲単位内に複数の USE ステートメントを指定することができます。
+----------------------------------IBM 拡張----------------------------------+
USE ステートメントを含むファイルがコンパイルされるとき、指定するモジュールはファイルの中で USE ステートメントの前になければなりません。あるいは、そのモジュールが他のファイルにある場合は、前もってコンパイルされていなければなりません。各参照エンティティーはモジュール内の共通エンティティーの名前でなければなりません。
+--------------------------------IBM 拡張の終り-------------------------------+
有効範囲単位内のエンティティーはモジュール・エンティティーと 使用関連 の関係になります。また、ローカル・エンティティーは対応するモジュール・エンティティーの属性を持ちます。
PRIVATE 属性の他、USE ステートメントの ONLY 文節はアクセス可能なモジュールに関する制約を指定します。 ONLY 文節を指定すると、only_list に指定されているエンティティーだけがアクセス可能になります。キーワードの後にリストを指定しないと、いずれのモジュール・エンティティーもアクセス可能にはなりません。 ONLY 文節がない場合、すべての共通エンティティーがアクセス可能になります。
1 つの有効範囲単位内に同一のモジュールを指定する USE ステートメントが複数存在し、そのうちの 1 つのステートメントに ONLY 文節がない場合、すべての共通エンティティーがアクセス可能になります。 USE ステートメントのそれぞれに ONLY 文節がある場合、1 つ以上の only_lists に指定されているエンティティーだけがアクセス可能になります。
ローカルな使用を目的としてアクセス可能なエンティティーの名前を変更することができます。モジュール・エンティティーは複数のローカル名でアクセスすることができます。名前変更を指定しない場合、使用関連のエンティティーの名前はローカル名になります。使用関連のローカル名を再度宣言することはできません。しかし、USE ステートメントかモジュールの有効範囲単位内に存在する場合は、ローカル名を PUBLIC または PRIVATE ステートメントに指定することができます。
ある有効範囲単位にアクセス可能な複数の総称インターフェースの名前、演算子、および割り当てが同じ場合、それらは 1 つの総称インターフェースとして処理されます。そのような場合、総称インターフェースのうちの 1 つに、同じ名前を持つアクセス可能なプロシージャーへのインターフェース本体を含ませることができます。それ以外の場合は、名前が有効範囲単位内のエンティティーを参照するために使用されていないときにだけ、任意の 2 つの使用関連のエンティティーに同じ名前を指定することができます。使用関連のエンティティーとホスト・エンティティーが同じ名前を共用する場合、ホスト・エンティティーはその名前を使用したホスト関連付けを介してもアクセスできないようになります。
モジュールは、直接的にも間接的にもそれ自身を参照することはできません。たとえば、モジュール Y がモジュール X を参照する場合、モジュール X はモジュール Y を参照することはできません。
モジュール (たとえばモジュール B) が使用関連付けを介して他のモジュール (たとえばモジュール A) の共通エンティティーにアクセスすることを考えてください。モジュール B のローカル・エンティティー (モジュール A からのエンティティーと使用関連の関係を持つエンティティーを含みます) の他のプログラム単位へのアクセス可能度は PRIVATE および PUBLIC 属性、また、それらを指定していない場合は、モジュール B のデフォルトのアクセス可能度で決定されます。もちろん、他のプログラム単位はモジュール A の共通エンティティーに直接アクセスすることができます。
例
MODULE A REAL :: X=5.0 END MODULE A MODULE B USE A PRIVATE :: X ! X cannot be accessed through module B REAL :: C=80, D=50 END MODULE B PROGRAM TEST INTEGER :: TX=7 CALL SUB CONTAINS SUBROUTINE SUB USE B, ONLY : C USE B, T1 => C USE B, TX => C ! C is given another local name USE A PRINT *, TX ! Value written is 80 because use-associated ! entity overrides host entity END SUBROUTINE END
関連情報