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
语句进行更详细的控制。还要记住,一旦在模块级隐式无
,就不需要在子例程级复制隐式无
。如果您的模块被声明为隐式无
,则模块中包含的所有内容都将自动成为隐式无
。同时请记住,一旦在模块级别隐式无
,则无需在子例程级别复制隐式无
。如果您的模块被声明为隐式无,则模块中包含的所有内容将自动成为隐式无。