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

Restricting access to module procedures from other module procedures

我最近发现了 Fortran 2008 的新功能,即 SUBMODULEs.

请看一下我在问题下的最小工作示例。编译后,它在终端上显示以下内容:

 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

不是真的。

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

  • subsub2 必须在与 sub0 相同的 module/submodule 层次结构级别已知,如示例中所示。 sub1sub2 的子程序必须与 sub0 处于同一级别或更低级别,在这种情况下,主机关联会了解 sub1sub2 程序可用于其他程序。

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

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

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