两个 FORTRAN 模块可以使用彼此的一部分吗?
Can two FORTRAN modules use parts of one another?
我知道在 FORTRAN 中禁止循环依赖模块。但我想知道这种禁令有多强烈。假设我有:
module mod1
integer, public :: i,j,k
use mod2, only: m
end module mod1
和
module mod2
integer, public :: l,m,n
use mod1, only: j
end module mod2
在我看来,这在逻辑上避免了循环,但这并不意味着标准允许它。它应该有效吗?
如果是这样,我在编译时遇到了问题,因为 mod1 当然想看到 mod2,反之亦然。有解决办法吗?
不,它不应该起作用。该标准规定,当看到 USE 时,模块必须是 "available"。如果在看到 "use mod2" 时 mod2 尚未编译,构建将失败。 (有些编译器可能允许您使用稍后在同一源代码中定义的模块,有些则不允许。)您可以使用子模块(参见 https://software.intel.com/en-us/blogs/2015/07/07/doctor-fortran-in-we-all-live-in-a-yellow-submodule)来完成您想要的 - 我不知道,因为很明显您发布的内容并不代表您的实际应用,但 Mark 提出的单独模块的建议更容易理解。
我知道在 FORTRAN 中禁止循环依赖模块。但我想知道这种禁令有多强烈。假设我有:
module mod1
integer, public :: i,j,k
use mod2, only: m
end module mod1
和
module mod2
integer, public :: l,m,n
use mod1, only: j
end module mod2
在我看来,这在逻辑上避免了循环,但这并不意味着标准允许它。它应该有效吗?
如果是这样,我在编译时遇到了问题,因为 mod1 当然想看到 mod2,反之亦然。有解决办法吗?
不,它不应该起作用。该标准规定,当看到 USE 时,模块必须是 "available"。如果在看到 "use mod2" 时 mod2 尚未编译,构建将失败。 (有些编译器可能允许您使用稍后在同一源代码中定义的模块,有些则不允许。)您可以使用子模块(参见 https://software.intel.com/en-us/blogs/2015/07/07/doctor-fortran-in-we-all-live-in-a-yellow-submodule)来完成您想要的 - 我不知道,因为很明显您发布的内容并不代表您的实际应用,但 Mark 提出的单独模块的建议更容易理解。