作为对您的问题的直接回答 - 是的 - 您可以使用INCLUDE
一行来引用一个文件,该文件包含sub
来自包含模块其余部分定义的文件中的定义(包含子例程代码的文件的包含行将在模块中的CONTAINS
语句之后。
MODULE test
INTEGER, PRIVATE :: dummy
PUBLIC :: sub
CONTAINS
INCLUDE 'sub.f90'
END MODULE test
! sub.f90
SUBROUTINE sub
dummy = 1
END SUBROUTINE sub
然而,这是一种非典型的安排。此外,如果“将它们全部放在一个文件中”是一个“非常糟糕的主意”,那么从一个模块中获得可能不同的子例程是一个好主意(或必要)吗?
更传统的 F90 解决方案是将共享数据(虚拟)作为公共实体放置在一个“低级”模块中,将子程序定义放置到一系列“中间级”模块中,这些模块根据需要使用低级模块,然后是最终的“高级”模块,该模块使用中间模块并提供对客户端代码的集体导出。然后使用源代码约定而不是语言规则来避免客户端代码直接使用中级和低级模块。
MODULE low_level_shared
IMPLICIT NONE
INTEGER, PUBLIC :: dummy
END MODULE low_level_shared
MODULE intermediate_sub1
IMPLICIT NONE
CONTAINS
SUBROUTINE sub1
USE low_level_shared
dummy = 1
END SUBROUTINE sub1
END MODULE intermediate_sub1
MODULE intermediate_sub2
IMPLICIT NONE
CONTAINS
SUBROUTINE sub2
USE low_level_shared
...
END SUBROUTINE sub2
END MODULE intermediate_sub2
MODULE high_level
USE intermediate_sub1
USE intermediate_sub2
PRIVATE
PUBLIC :: sub1, sub2
END MODULE high_level
PROGRAM client_code
USE high_level
...
CALL sub1
END PROGRAM client_code
Fortran 2008 允许通过子模块功能进行额外的结构和控制,其中模块过程接口可以在模块过程实现的单独程序单元中定义。