子模組 (Fortran 2008)
子模組是延伸模組或另一個子模組的程式單元。 它可以提供其介面宣告在上代模組或上代子模組中的程序定義。 它也可能包含其他實體的宣告和定義。 這些定義包括資料物件定義、名單群組、衍生類型定義、程序介面區塊及程序定義。
子模組的名稱不能與其他廣域實體相同,例如程式單元、共用區塊、外部程序、重要區段或廣域實體的連結標籤。 如果子模組沒有相同的上代模組,則子模組的名稱可以與另一個子模組的名稱相同。
語法
- SUBMODULE_陳述式
- 如需語法詳細資料,請參閱 SUBMODULE。
- specification_part
- 它是 陳述式順序及執行順序中編號為 2 、 4 及 5 的陳述式群組中的陳述式順序,不包括 ENTRY 及 FORMAT 陳述式。
- CONTAINS_statement
- 如需語法詳細資料,請參閱 CONTAINS。
- END_SUBMODULE_statement
- 如需語法詳細資料,請參閱 END。
規則
子模組只有一個上代模組,且可以有一或多個上代子模組。
子模組可能包含模組子程式,且是模組子程式的主機範圍設定單元。 模組子程式必須遵循 CONTAINS 陳述式,且可以包含內部程序。 模組程序是由模組子程式或模組子程式中的登錄所定義。
在子模組中,您可以定義由上代模組或上代子模組中的對應模組程序介面主體所宣告的個別模組程序。
子模組有權存取其上代模組或子模組中所宣告及定義的實體 (依主機關聯)。 子模組是它包含的任何模組程序、介面區塊或衍生類型定義的主機。 透過主機關聯,子模組包含的模組程序、介面區塊及衍生類型定義可以存取子模組範圍內的實體。 子模組中實體的宣告和定義也可透過其後代子模組中的主機關聯來存取。
使用關聯無法存取子模組。
子模組的區域變數只能在該子模組範圍設定單元、任何包含的範圍設定單元或其後代子模組中存取。
在子模組的範圍設定單元中隱含地宣告的變數、共用區塊或程序指標具有 SAVE 屬性,明確規格可能會確認該屬性。
下列規則適用於子模組的 specification_part :
- 它不能包含陳述式函數陳述式、 ENTRY 陳述式或 FORMAT 陳述式,雖然這些陳述式可以出現在模組子程式的規格組件中。
- 如果規格表示式或常數表示式包括一般實體的參照,則該一般實體不能在規格表示式或常數表示式之後的子模組中定義特定程序。
範例
在此範例中,子模組 n 由具有 MODULE 字首指定元的子常式子程式及個別模組子程式定義兩個個別模組程序。 其對應的模組程序介面主體在上代模組 m中宣告。
MODULE m ! The ancestor module m
INTEGER :: i
INTERFACE
MODULE SUBROUTINE sub1(arg1) ! Module procedure interface body for sub1
INTEGER :: arg1
END SUBROUTINE
MODULE SUBROUTINE sub2(arg2) ! Module procedure interface body for sub2
INTEGER :: arg2
END SUBROUTINE
END INTERFACE
END MODULE
SUBMODULE (m) n ! The descendant submodule n
INTEGER :: j ! Specification part
CONTAINS ! Module subprogram part
MODULE SUBROUTINE sub1(arg1) ! Definition of sub1 by subroutine subprogram
INTEGER :: arg 1
arg1 = 1
i = 2 ! Host association
j = 3 ! Host association
END SUBROUTINE
MODULE PROCEDURE sub2 ! Definition of sub2 by separate module subprogram
arg2 = 1
END PROCEDURE
END SUBMODULE
