ONLY 子句并从级联中的模块继承

The ONLY clause and inheriting from modules in a cascade

我使用以下层次结构在三个不同的模块(在三个不同的文件中)定义了三种类型:

MODULE module1 (low_level)
    IMPLICIT NONE
    TYPE type1
        real(kind=kind(0.d0)) :: var1
    END TYPE type1
    ... more declarations ...
END MODULE module1

MODULE module2 (medium_level)
    USE module1, only : type1
    IMPLICIT NONE
    TYPE type2
        type(type1) :: var2
    END TYPE type2
    ... more declarations ...
END MODULE module2

MODULE module3 (high_level)
    USE module2, only : type2
    IMPLICIT NONE
    TYPE type3
        type(type2) :: var3
    END TYPE type3
    ... more declarations ...
END MODULE module3

现在我有另一个模块,其中定义了模块过程:

MODULE module4
    IMPLICIT NONE
    CONTAINS
    SUBROUTINE sub1(var4)
        USE module3, only : type3
        IMPLICIT NONE
        type(type3), intent(inout) :: var4
        type(type1) :: var5
        ... using var5 ...
    END SUBROUTINE sub1
END MODULE module4

在子程序sub1中编译module4时编译器报错:

Error: Derived type 'type1' at (1) is being used before it is defined

在子程序中添加一个USE module1, only : type1问题解决

但是,鉴于子例程sub1使用module3,它使用module2,而module2使用module1,我不明白为什么我需要告诉编译器"re-declare" type1 已在 module1 中声明并由 module3 通过 module2USE 语句使用,继承的概念应适用于此。如果您必须编写每个模块依赖项,我看不到使用模块调用其他模块的优势...

我肯定可能误解了什么,任何解释将不胜感激。

如果你这样做

module module2
  USE module1, only : type1

module module3
  USE module2, only : type2 

您无法在 module3 中访问 type1,因为您仅导入 type2

看来你想要

module module3
  USE module2, only : type1, type2