关于'只使用a_module:a_subroutine'

时间:2014-09-15 15:54:12

标签: fortran fortran90

有时我想在其他子程序中包含一个模块,但我只需要该模块中的几个子程序。有什么区别

use a_module,  only: a_subroutine

或只是

use a_module

1 个答案:

答案 0 :(得分:1)

这是一个完整的答案,其中一些已经在评论中进行了讨论。

来自Metcalf等。 (2011)第146页(Fortran参考书目),use a_module提供(强调):

  

访问 all 所有公共命名数据对象,派生类型,   接口块,过程,通用标识符和名称列表组   在名为模块中。

相反,use a_module, only an_entity提供:

  

仅在指定了实体...的情况下才能访问模块中的实体。

use a_module等同于不推荐使用的Python实践(例如[2]中的python):

from a_module import *

use a_module, only an_entity等效于首选的python做法:

from a_module import an_entity

不幸的是,推荐的python做法

import module [as name]

import module.submodule [as name]

在Fortran中不可用,因为Fortran会将所有实体导入到全局名称空间中,而不是像python中那样通过模块的名称空间从模块访问实体,例如:

import numpy as np
array = np.array([1, 2, 3])

如评论和其他地方(例如[3])所述,为了代码清晰并避免命名空间污染/名称冲突(),显式导入(use a_module, only an_entity)优于隐式导入(use a_module)。 “明确胜于隐含”)。

Metcalf等。 (2011)还注意到,如果您需要从不同模块中使用两个具有相同名称的实体,则可以通过在本地重命名一个(或两个)冲突实体(即仅在您的程序/模块内)来避免名称冲突,例如

use stats_lib, only sprod => prod
use maths_lib, only prod

其中prod的{​​{1}}使用名称stats_lib在本地访问,而sprod的{​​{1}}使用名称prod在本地访问

偶然地,梅特卡夫等人。 (2011)还请注意:

  

如果名称中没有引用名称,则允许名称冲突   作用域。

即您可以成功编译:

maths_lib

没有问题,只要程序/模块中未使用模块的prod(或任何其他冲突名称)即可。但是,由于上述原因,不建议这种做法。

[1] Metcalf,M,Reid,J和Cohen,M。(2011)“现代Fortran的解释”(牛津大学出版社)

[2] https://www.tutorialspoint.com/python/python_modules.htm

[3] http://www.fortran90.org/src/best-practices.html