0

我最近发现了 Fortran 2008 的新特性,即SUBMODULEs。

请看一下我的最小工作示例。编译后在终端上放如下:

 Accessed sub0
 Accessed sub1
 Accessed sub2

也就是说,它应该是模块程序,sub1并且sub2可以CALL相互连接,一切正常。

由于代码架构和维护等原因,我需要以某种方式限制这种访问。也就是说,模块过程 (sub1sub2) 彼此不可见。我可以这样做吗?

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
4

1 回答 1

3

并不真地。

两者sub1sub2都由 访问sub0,这意味着其中一个(或某种组合):

  • sub并且sub2必须在模块/子模块层次结构的同一级别上已知sub0,如示例中所示。sub1和的子程序sub2必须处于与sub0或低于相同的级别,在这种情况下,主机关联使该sub1sub2过程的知识可用于其他过程。

  • sub1并且sub2需要是其他两个模块的公共实体。但在这种情况下,sub1or的子程序sub2总是可以直接引用定义其他的模块。

  • sub1并且sub2是外部程序。再次,sub1or的子程序sub2可以直接访问其他外部程序。

如果子范围中有一个名称会隐藏主机实体中的名称(或使用 F2015 草案标准中导入语句的扩展功能),则主机中的实体可以对子范围隐藏。您可以放置​​一个与要从特定范围屏蔽的过程名称相同名称的东西的虚拟声明,但这是相当人为的。

于 2016-09-25T22:13:51.760 回答