什么是子模块以及它们是如何使用的?

Exa*_*ale 7 fortran

我不太了解子模块的用途.我知道大多数编译器对它们的支持很少,但这个概念很有意思.我想我理解了基本概念,但我见过的所有例子(Fortran Wiki,Modern Fortran Explained,技术报告)都是简单的,使用完全相同的例子(point在同一个文件中输入所有)并且不显示它们的实际在调用函数时使用.在什么情况下你想使用子模块?如果要使用子模块,是否包含use语句?如果有人能提供一个例子,我真的很喜欢.

Ian*_*anH 8

简单的答案是,当您希望父模块或子模块中的代码较少时,可以将代码放入子模块中.

您可能希望父模块或子模块中的源代码更少,因为父代的源代码太长了.

在子模块之前,唯一可行的方法是将源代码从模块中移出到不同的模块或外部过程中.但是,如果要移动的源代码引用保留在原始模块中的PRIVATE事物或组件,则这并不总是可行的.子模块可以通过主机关联访问其父模块或子模块中声明的内容 - 源代码仍然可以以与它仍然是父项的物理源代码的一部分相同的方式访问PRIVATE.

您可能还希望将源代码从父模块中分离出来,以避免编译级联(如果与处理器相关).对模块的更改通常需要重新编译该模块(及其后代),然后重新编译使用该模块的所有程序单元(及其后代),重复级联以进一步重新编译,其中任何重新编译的程序单元本身是模块.对子模块的更改通常只需要重新编译该子模块及其任何后代子模块.

子模块的分层特性也可能适合分层代码安排 - 您不希望同级别的兄弟姐妹能够直接访问他们定义的实体和过程.

USE语句仅用于您希望访问模块提供的作用域中的内容的位置.您不能在USE语句中"使用"子模块(尽管在模块中定义其INTERFACE的过程可能在子模块中定义其主体).

模块的子模块不使用父模块(它不能 - 有点像试图使用它自己的模块)并且它不需要 - 它已经通过主机关联访问模块中的东西.启动子模块程序单元的子模块语句标识它扩展的模块(可能还有另一个子模块).模块的源代码中没有任何内容告诉它可以扩展它的子模块数量.