子模組 (Fortran 2008)

子模組是延伸模組或另一個子模組的程式單元。 它可以提供其介面宣告在上代模組或上代子模組中的程序定義。 它也可能包含其他實體的宣告和定義。 這些定義包括資料物件定義、名單群組、衍生類型定義、程序介面區塊及程序定義。

子模組的名稱不能與其他廣域實體相同,例如程式單元、共用區塊、外部程序、重要區段或廣域實體的連結標籤。 如果子模組沒有相同的上代模組,則子模組的名稱可以與另一個子模組的名稱相同。

語法

子模組
讀取語法圖跳過視覺化語法圖SUBMODULE_statement
讀取語法圖跳過視覺化語法圖specification_part
讀取語法圖跳過視覺化語法圖module_subprogram_part
讀取語法圖跳過視覺化語法圖END_SUBMODULE_statement
模組 _subprogram_part
讀取語法圖跳過視覺化語法圖CONTAINS_statement
讀取語法圖跳過視覺化語法圖module_subprogram
SUBMODULE_陳述式
如需語法詳細資料,請參閱 SUBMODULE
specification_part
它是 陳述式順序及執行順序中編號為 2 4 5 的陳述式群組中的陳述式順序,不包括 ENTRYFORMAT 陳述式。
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

相關資訊