我最近发现了Fortran 2008的新功能,即SUBMODULE
s。
请查看我在问题上的最低工作示例。编译后,它将以下内容放在终端上:
Accessed sub0
Accessed sub1
Accessed sub2
就是这样,sub1
和sub2
的模块程序可以相互CALL
,一切正常。
由于代码架构和维护等原因,我需要以某种方式限制此访问。也就是说,模块过程(sub1
和sub2
)彼此不可见。 我可以这样做吗?
MODULE parent
PRIVATE
PUBLIC :: sub0
INTERFACE
MODULE SUBROUTINE sub1 ()
END SUBROUTINE
MODULE SUBROUTINE sub2 ()
END SUBROUTINE
END INTERFACE
CONTAINS
SUBROUTINE sub0 ()
PRINT *, 'Accessed sub0'
CALL sub1 ()
END SUBROUTINE
END MODULE
SUBMODULE ( parent ) submod1
CONTAINS
MODULE PROCEDURE sub1
PRINT *, 'Accessed sub1'
CALL sub2 ()
END SUBROUTINE
END SUBMODULE
SUBMODULE ( parent ) submod2
CONTAINS
MODULE PROCEDURE sub2
PRINT *, 'Accessed sub2'
END PROCEDURE
END SUBMODULE
PROGRAM driver
USE parent
CALL sub0 ()
END PROGRAM
答案 0 :(得分:3)
不是。
sub1
和sub2
都由sub0
访问,这意味着(或某种组合):
sub
和sub2
必须在与sub0
相同的模块/子模块层次结构中知道,如示例所示。 sub1
和sub2
的子程序必须与sub0
或更低级别相同,在这种情况下,主机关联可以了解sub1
或{{1其他程序可用的程序。
sub2
和sub1
需要是其他两个模块的公共实体。但在这种情况下,sub2
或sub1
的子程序总是可以直接引用定义另一个的模块。
sub2
和sub1
是外部程序。同样,sub2
或sub1
的子程序可以直接访问其他外部程序。
如果子范围中的名称隐藏了主机实体中的名称(或者使用F2015草案标准中的import语句的扩展功能),则可以从子范围隐藏主机中的实体。您可以使用与要从特定范围中阻止的过程名称相同的名称来声明某个虚拟声明,但这是相当人为的。