仅从模块

时间:2016-01-16 00:19:47

标签: module fortran intel-fortran

我有一个模块,我编写了一堆经常使用的子程序。但是,并非每次我都需要它们。是否可以从该模块加载一个(或两个......)子程序?

我这样做的兴趣是有一个特殊的子程序需要另一个模块才能工作,所以如果我不打算使用那个子程序,我宁愿避免加载那个额外的模块。

以下是我所拥有的一个例子

MODULE MYLIBRARY
IMPLICIT NONE
CONTAINS

  SUBROUTINE PROC1
    PRINT *, 'This is PROC1'
  END SUBROUTINE PROC1

  SUBROUTINE PROC2
    USE EXTRAMOD
    PRINT *, 'This is PROC2'
  END SUBROUTINE PROC2

END MODULE MYLIBRARY

我希望能够只加载我的主程序PROC1,所以我不必加载模块EXTRAMOD(实际上我甚至不想要那个文件)。在我的主程序中,我尝试了仅选项,但这似乎只适用于变量而不是子程序。以下是主文件

的示例
PROGRAM MAIN    
  USE MYLIBRARY, ONLY : PROC1
  IMPLICIT NONE
  CALL PROC1  
END PROGRAM Main

当我编译它时,我收到错误“打开已编译模块文件时出错。检查INCLUDE路径。[EXTRAMOD]”。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

除非您更改MYLIBRARY模块的来源,使其不再引用EXTRAMOD,否则您无法使用该编译器执行此操作。

(ONLY说明符确实可以限制在给定范围内可访问的模块的标识符,包括过程的标识符,但这与您的基础问题无关。)

请注意,对于给定的源,您看到的行为是特定于编译器的。

使用该编译器,存储在mod文件(用于将信息从模块传送到使用模块的位置的编译器特定文件)中的信息通常限于在该模块中立即声明的内容。这意味着在模块引用另一个模块的情况下,编译器通常需要在使用原始模块时找到该另一个模块的mod文件。

其他编译器可能会使每个mod文件完整 - 存储模块中立即声明的内容和其他模块引用的内容。这减少了需要分发的文件数量,但会产生更大的mod文件。

如果两个子例程完全相互独立,那么您可以将MYLIBRARY模块的源分成两部分,并且只使用包含所需模块的分割部分。

如果EXTRAMOD中的实体不属于PROC2的特征(例如,如果您使用EXTRAMOD中定义的类型作为PROC2的参数类型,然后EXTRAMOD中的实体被用作特征的一部分),然后您可以将PROC2的定义移动到子模块中。这也会打破MYLIBRARY的mod文件对EXTRAMOD的mod文件的依赖。