Fortran 元素的结束语句

End statement for Fortran elements

在 Fortran 77 或 Fortan 90 或 Fortran 2003 中,是否可以在没有相应结束语句的情况下结束后续构造,如下所示?

例如,是否可以仅使用 end 语句而不是 end program 来结束程序?

子程序:结束子程序

函数:结束函数

模块:结束模块

程序:结束程序

如果:结束if\endif

做:结束do\enddo

select:结束select\endselect

它有点复杂,但是当你包含编码风格标签时,我首先要说我强烈建议在所有情况下都使用完整形式——任何像样的编辑器都会自动神奇地适当地完成一个 End 语句。例如在 emacs 中,我使用的编辑器,在输入 End 后点击 tab 将自动添加所有文本。

但在某些情况下,技术上并不需要。对于诸如 do、if、select、where 等控制结构,需要完整形式。然而对于程序和子程序来说严格来说它不是 - 事实上最简单的 Fortran 程序就是

End

但是我不建议这样做,因为完整形式可以有效地记录程序,而程序员的开销几乎为零,而且这也意味着您不必记住何时需要完整形式,何时不需要.

我还要补充一点,当你包含编码风格标签时,我所说的完整形式实际上是指还包含 program/subprogram 名称或控制构造名称(如果使用)的形式。因此我会写一个 "Hello World" 程序作为

Program hello_world

  Implicit None

  Write( *, * ) 'Hello World!'

End Program hello_world

最后我要补充一点,在这个时代没有人应该使用 Fortran77,它已经过时了四分之一个世纪,而且 Fortran90 也应该因新代码而退休。

可以在程序单元和 subprograms/procedure 定义中使用未修饰的 end

  • end [program]
  • end [module]
  • end [submodule]
  • end [block data]
  • end [function]
  • end [subroutine]

不允许将未经修饰的 end 用于可执行结构、接口块,或 "assignment constructs" 或类型定义(基本上,其他任何地方):

  • end associate
  • end block
  • end critical
  • end do
  • end enum
  • end forall
  • end if
  • end interface
  • end select(对于每个 select caseselect rankselect type
  • end team
  • end type
  • end where

此外,对于第一个列表,在添加程序时需要使用扩展形式 unit/procedure 名称:

  • end ... name

请注意,我没有提到语言修订:其中一些问题甚至在 Fortran 77 中都不存在,上面列表中的一些是 Fortran 2018 中的新问题。


简单提一下风格,我无话可说