为什么我应该在Fortran中使用“仅使用”

时间:2018-08-04 14:53:49

标签: fortran

在python中这样的语句:

sendEvent(withName, body)

很有道理,因为Python是一种解释器语言,我不希望python加载所有353个其他函数。

Fortran具有类似的构造:

from module import function354

我为什么要使用它?编译器仍然会创建一个* .mod文件,以编译所有功能。如果指定use module, only : function354 语句,在编译或运行时是否有任何性能优势?

我可以看到避免命名冲突可能会有所帮助,但除此之外,我并没有真正理解这一点。

2 个答案:

答案 0 :(得分:6)

两个主要原因

  1. 为了避免名称冲突,正如您提到的,但似乎并不重要。在大型,复杂的代码中,任何有助于维护性的东西都是有好处的,因此use, only是有助于此目的的有用补充
  2. 它会自动记录实体的来源。鉴于首次阅读的代码庞大,复杂,我几乎可以保证您会花时间研究哪个模块来自哪个模块,因此use, only是一个很好的功能,有助于提高代码的可读性

您不仅需要快速的代码-可维护性至关重要,更重要的是正确性!

答案 1 :(得分:0)

免责声明:

有些人在评论中(正确地)指出 use rename => name 可以独立于 use, only 使用。像这样:

use module, f354 => function354

我保留答案,因为它可以作为 use 声明的补充信息,对降落在这里的人有用。


原答案:

为了完整起见,use, only 还提供了另一个功能,即能够使用本地绑定的名称重命名导入的名称(仅不需要此功能,请参阅免责声明强> 高于)。

像这样:

use module, only: f354 => function354

事实证明,这在几个不同的场景中对我很有用:

  1. 当两个使用的模块提供具有相同名称的类型或函数时,解决特定名称的歧义。
    示例:

    use module1, only: m1_init => initialize
    use module2, only: m2_init => initialize
    
  2. 当原始名称太长、太神秘或在您的程序中经常使用时,请使用短名称。
    示例(来自 fgsllapack):

    use fgsl, only: stride => fgsl_aux_vector_double_stride      ! too long
    use lapack, only: solve => dgesvx                            ! too cryptic
    use iso_c_binding, only: i32 => c_int32_t, i64 => c_int64_t  ! too frequent
    
  3. 使重构或使用条件编译/模板更容易:
    示例(来自Fortran-lang/stdlib):

    use iso_fortran_env, only: sp => real32, dp => real64, qp => real128
    ! If we decide later to use iso_c_binding instead of iso_fortran_env:
    ! use iso_c_binding, only: sp => c_float, dp => c_double, qp => c_float128