从模块中只加载一个子程序
Loading only one subroutine from module
我有一个模块,我在其中编写了一堆我经常使用的子例程。但是,并非每次我都需要它们。是否可以从该模块仅加载一个(或两个...)子程序?
我这样做的兴趣在于有一个特定的子例程需要另一个模块才能工作,所以如果我不打算使用该子例程,我宁愿避免加载那个额外的模块。
这是我的例子
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(实际上我什至不需要那个文件)。在我的主程序中,我尝试使用 ONLY 选项,但这似乎只适用于变量而不适用于子例程。这是主文件的示例
PROGRAM MAIN
USE MYLIBRARY, ONLY : PROC1
IMPLICIT NONE
CALL PROC1
END PROGRAM Main
编译时,出现错误 "Error in opening the compiled module file. Check INCLUDE paths. [EXTRAMOD]"。
有什么想法吗?
你想做的事情用那个编译器是不可能的,除非你改变 MYLIBRARY
module 的来源,这样它就不再引用 EXTRAMOD
.
(ONLY 说明符确实可以限制在给定范围内可访问的 module 的标识符,包括过程的标识符,但这与您的基本问题无关。)
请注意,对于给定源,您看到的行为是特定于编译器的。
使用该编译器,信息存储在 mod
文件中(这是一个编译器特定文件,用于将信息从 module 传递到 module 所在的位置used) 编译 module 的结果通常仅限于在该 module 中立即声明的内容。这意味着在 module 引用另一个 module 的情况下,当原始 mod使用了ule。
其他编译器可能使每个 mod 文件完整 - 存储在 mod 规则中立即声明的内容和从其他 mod 规则引用的任何内容。这减少了需要分发的文件数量,但会产生更大的 mod 个文件。
如果两个子程序完全独立,那么可以将MYLIBRARY
module的源码一分为二,只使用包含mod你需要的规则。
如果 EXTRAMOD
中的实体不是 PROC2
的特征的一部分(例如,如果您使用 EXTRAMOD
中定义的类型作为 [=16] 的参数类型=],那么 EXTRAMOD
中的实体将用作特征的一部分),那么您可以将 PROC2
的定义移动到子 mod 规则中。这也将打破 MYLIBRARY
的 mod 文件对 EXTRAMOD
.
的 mod 文件的依赖性
我有一个模块,我在其中编写了一堆我经常使用的子例程。但是,并非每次我都需要它们。是否可以从该模块仅加载一个(或两个...)子程序?
我这样做的兴趣在于有一个特定的子例程需要另一个模块才能工作,所以如果我不打算使用该子例程,我宁愿避免加载那个额外的模块。
这是我的例子
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(实际上我什至不需要那个文件)。在我的主程序中,我尝试使用 ONLY 选项,但这似乎只适用于变量而不适用于子例程。这是主文件的示例
PROGRAM MAIN
USE MYLIBRARY, ONLY : PROC1
IMPLICIT NONE
CALL PROC1
END PROGRAM Main
编译时,出现错误 "Error in opening the compiled module file. Check INCLUDE paths. [EXTRAMOD]"。
有什么想法吗?
你想做的事情用那个编译器是不可能的,除非你改变 MYLIBRARY
module 的来源,这样它就不再引用 EXTRAMOD
.
(ONLY 说明符确实可以限制在给定范围内可访问的 module 的标识符,包括过程的标识符,但这与您的基本问题无关。)
请注意,对于给定源,您看到的行为是特定于编译器的。
使用该编译器,信息存储在 mod
文件中(这是一个编译器特定文件,用于将信息从 module 传递到 module 所在的位置used) 编译 module 的结果通常仅限于在该 module 中立即声明的内容。这意味着在 module 引用另一个 module 的情况下,当原始 mod使用了ule。
其他编译器可能使每个 mod 文件完整 - 存储在 mod 规则中立即声明的内容和从其他 mod 规则引用的任何内容。这减少了需要分发的文件数量,但会产生更大的 mod 个文件。
如果两个子程序完全独立,那么可以将MYLIBRARY
module的源码一分为二,只使用包含mod你需要的规则。
如果 EXTRAMOD
中的实体不是 PROC2
的特征的一部分(例如,如果您使用 EXTRAMOD
中定义的类型作为 [=16] 的参数类型=],那么 EXTRAMOD
中的实体将用作特征的一部分),那么您可以将 PROC2
的定义移动到子 mod 规则中。这也将打破 MYLIBRARY
的 mod 文件对 EXTRAMOD
.