在包含在模块 1 或模块 1 本身中的子程序中使用模块 2?

USE a module2 in SUBROUTINE which is contained in module1 or in module1 itself?

像下面这样的模块之间是否存在显着差异

MODULE module1
   USE module2
   IMPLICIT NONE
       :
CONTAINS

   SUBROUTINE subroutine1
      IMPLICIT NONE
          :
   END SUBROUTINE subroutine1

   SUBROUTINE subroutine2
      IMPLICIT NONE
          :
   END SUBROUTINE subroutine2

END MODULE module1

还有一个像下面这样的

MODULE module1
   IMPLICIT NONE
       :
CONTAINS

   SUBROUTINE subroutine1
      USE module2
      IMPLICIT NONE
          :
   END SUBROUTINE subroutine1

   SUBROUTINE subroutine2
      IMPLICIT NONE
          :
   END SUBROUTINE subroutine2

END MODULE module1

除了在第一种情况下两个子例程都看到 module2 之外?

可能很重要并且应该注意的区别是

MODULE module1
   USE module2

默认情况下,module1 也会导出 module2 的所有 public 符号。当您仅在子例程中使用 module2 时不会发生这种情况,因为模块看不到它。

所以:

  module module2
    integer int
  end module

  module module1
    use module2
  end module

    use module1
    print *, int
  end

是可能的,但是

  module module2
    integer int
  end module

  module module1
  contains
    subroutine s
      use module2
    end subroutine
  end module

    use module1
    print *, int
  end

不是。

当然,可以通过 only 子句以及 privatepublic 语句更详细地控制此行为。