限制从其他模块过程访问模块过程

时间:2016-09-25 13:59:43

标签: fortran fortran2008

我最近发现了Fortran 2008的新功能,即SUBMODULE s。

请查看我在问题上的最低工作示例。编译后,它将以下内容放在终端上:

 Accessed sub0
 Accessed sub1
 Accessed sub2

就是这样,sub1sub2的模块程序可以相互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

1 个答案:

答案 0 :(得分:3)

不是。

sub1sub2都由sub0访问,这意味着(或某种组合):

  • subsub2必须在与sub0相同的模块/子模块层次结构中知道,如示例所示。 sub1sub2的子程序必须与sub0或更低级别相同,在这种情况下,主机关联可以了解sub1或{{1其他程序可用的程序。

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

  • sub2sub1是外部程序。同样,sub2sub1的子程序可以直接访问其他外部程序。

如果子范围中的名称隐藏了主机实体中的名称(或者使用F2015草案标准中的import语句的扩展功能),则可以从子范围隐藏主机中的实体。您可以使用与要从特定范围中阻止的过程名称相同的名称来声明某个虚拟声明,但这是相当人为的。