Module 在子程序中使用模块2,该子程序包含在模块1中还是模块1本身中?

Module 在子程序中使用模块2,该子程序包含在模块1中还是模块1本身中?,module,nested,fortran,contains,subroutine,Module,Nested,Fortran,Contains,Subroutine,以下模块之间是否存在显著差异 MODULE module1 USE module2 IMPLICIT NONE : CONTAINS SUBROUTINE subroutine1 IMPLICIT NONE : END SUBROUTINE subroutine1 SUBROUTINE subroutine2 IMPLICIT NONE : END SUBROUTINE subr

以下模块之间是否存在显著差异

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
还有一个像下面这样的

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

除了在第一种情况下两个子例程都可以看到模块2这一事实之外,可能存在的显著差异以及应该注意的是

MODULE module1
   USE module2
默认情况下,
module1
还将导出
module2
的所有公共符号。如果仅在子例程中使用
module2
,则不会发生这种情况,因为模块看不到它

因此:

这是可能的,但是

  module module2
    integer int
  end module

  module module1
  contains
    subroutine s
      use module2
    end subroutine
  end module

    use module1
    print *, int
  end
事实并非如此


当然,这种行为可以通过
only
子句和
private
public
语句进行更详细的控制。

重要的区别在于

MODULE module1
   USE module2
默认情况下,
module1
还将导出
module2
的所有公共符号。如果仅在子例程中使用
module2
,则不会发生这种情况,因为模块看不到它

因此:

这是可能的,但是

  module module2
    integer int
  end module

  module module1
  contains
    subroutine s
      use module2
    end subroutine
  end module

    use module1
    print *, int
  end
事实并非如此


当然,这种行为可以通过
only
子句和
private
public
语句进行更详细的控制。

还要记住,一旦在模块级
隐式无
,就不需要在子例程级复制
隐式无
。如果您的模块被声明为
隐式无
,则模块中包含的所有内容都将自动成为
隐式无
。同时请记住,一旦在模块级别
隐式无
,则无需在子例程级别复制
隐式无
。如果您的模块被声明为隐式无,则模块中包含的所有内容将自动成为隐式无。