Fortran 限制从其他模块过程访问模块过程
我最近发现了Fortran 2008的新特性,即Fortran 限制从其他模块过程访问模块过程,fortran,fortran2008,Fortran,Fortran2008,我最近发现了Fortran 2008的新特性,即子模块s 请看一下我的最低工作示例。编译后,它会在终端上放置以下内容: Accessed sub0 Accessed sub1 Accessed sub2 也就是说,sub1和sub2的模块过程可以相互调用,一切正常 由于代码体系结构和维护等原因,我需要以某种方式限制这种访问。也就是说,模块过程(sub1和sub2)彼此不可见我可以这样做吗? MODULE parent PRIVATE PUBLIC :: sub0
子模块
s
请看一下我的最低工作示例。编译后,它会在终端上放置以下内容:
Accessed sub0
Accessed sub1
Accessed sub2
也就是说,sub1
和sub2
的模块过程可以相互调用
,一切正常
由于代码体系结构和维护等原因,我需要以某种方式限制这种访问。也就是说,模块过程(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
不是真的
sub1
和sub2
都由sub0
访问,这意味着(或某些组合):
和sub
必须在与sub2
相同的模块/子模块层次结构级别上已知,如示例所示。sub0
和sub1
的子程序必须与sub2
处于同一级别或更低级别,在这种情况下,主机关联使sub0
或sub1
程序的知识可供其他程序使用sub2
和sub1
需要是其他两个模块的公共实体。但是在这种情况下,sub2
或sub1
的子程序总是可以直接引用定义另一个模块的模块sub2
和sub1
是外部过程。同样,sub2
或sub1
的子程序可以直接访问其他外部过程sub2
sub1
和sub2
都由sub0
访问,这意味着(或某些组合):
和sub
必须在与sub2
相同的模块/子模块层次结构级别上已知,如示例所示。sub0
和sub1
的子程序必须与sub2
处于同一级别或更低级别,在这种情况下,主机关联使sub0
或sub1
程序的知识可供其他程序使用sub2
和sub1
需要是其他两个模块的公共实体。但是在这种情况下,sub2
或sub1
的子程序总是可以直接引用定义另一个模块的模块sub2
和sub1
是外部过程。同样,sub2
或sub1
的子程序可以直接访问其他外部过程sub2
如果子范围中的名称隐藏在主机实体中的名称(或通过使用F2015标准草案中的import语句的扩展功能),则可以对子范围隐藏主机中的实体。您可以使用与要从特定范围中屏蔽的过程名称相同的名称对某个对象进行虚拟声明,但这是相当人为的。为什么不为这两个过程设置两个单独的模块?@VladimirF Yes当然可以。这正是我现在正在做的。但是,我正在努力保持Fortran的新的现代特性,如
子模块
。此外,据我所知,类似C#中的代码映射在Fortran中是不可用的,因此我害怕使用大量的源代码(调试、维护和开发)。尝试了上述方案来简化过程之间的调用
控制,但这似乎是错误的。为什么不为两个过程提供两个单独的模块?@VladimirF是的。这正是我现在正在做的。但是,我正在努力保持Fortran的新的现代特性,如子模块
。此外,据我所知,类似C#中的代码映射在Fortran中是不可用的,因此我害怕使用大量的源代码(调试、维护和开发)。尝试了上述方案来简化过程间调用的控制,但这似乎是错误的。“sub1和sub2需要是其他两个模块的公共实体。但在这种情况下,sub1或sub2的子程序总是可以直接引用定义另一个模块的模块。”但他们不必这样做。“sub1和sub2必须是其他两个模块的公共实体。但在这种情况下,sub1或sub2的子程序总是可以直接引用定义另一个的模块。”但它们不必这样做。