假设你有一个Fortran 90模块,其中包含大量的变量、函数和子程序。在你的USE
语句中,你遵循哪种惯例:
- 使用
, only :
语法明确声明你正在使用哪些变量/函数/子程序,例如:USE [module_name], only : variable1, variable2, ...
? - 插入一条全局的
USE [module_name]
语句?
一方面,only
子句使得代码有点冗长。然而,在代码中它强制你重复自己,如果你的模块包含大量的变量/函数/子程序,代码就会变得混乱。
这里是一个例子:
module constants
implicit none
real, parameter :: PI=3.14
real, parameter :: E=2.71828183
integer, parameter :: answer=42
real, parameter :: earthRadiusMeters=6.38e6
end module constants
program test
! Option #1: blanket "use constants"
! use constants
! Option #2: Specify EACH variable you wish to use.
use constants, only : PI,E,answer,earthRadiusMeters
implicit none
write(6,*) "Hello world. Here are some constants:"
write(6,*) PI, &
E, &
answer, &
earthRadiusInMeters
end program test
更新
希望有人像“Fortran?只需要用C#重写它!”一样说话,这样我就可以给你点个踩。
更新
我喜欢Tim Whitcomb的答案,其中比较了Fortran的 USE modulename
与Python的 from modulename import *
。 这是Stack Overflow以前讨论过的一个主题:
‘import module’ or ‘from module import’
- 在一个答案中,Mark Roddy提到:
不要使用'from module import *'。 对于任何合理大型的代码集,如果您'import *',则可能会将其固定到模块中,无法删除。 这是因为很难确定代码中使用的项目来自'module',使得很容易达到您认为不再使用导入,但极其难以确定的程度。
- 在一个答案中,Mark Roddy提到:
-
- dbr的答案包含
不要使用from x import *-这使得您的代码非常难以理解,因为您无法轻松地看到方法来自哪里(来自x import *;来自y import *; my_func()在哪里定义?)。
- dbr的答案包含
因此,我倾向于通过显式列出我在模块中使用的所有项来达成一致。
USE modulename, only : var1, var2, ...
如果你有一个模块太大,以至于你感到需要加上ONLY,这意味着你的模块太大了。将其拆分。