在包含在模块 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
子句以及 private
和 public
语句更详细地控制此行为。
像下面这样的模块之间是否存在显着差异
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
子句以及 private
和 public
语句更详细地控制此行为。