在Fortran代码中,RETURN语句放在END SUBROUTINE之前被认为是一种好的做法吗?

5
在大型遗留代码中,在END SUBROUTINE之前只有一个简单的RETURN语句(没有任何参数)是一个好习惯,还是应该将其删除?
我正在处理一份大型科学计算遗留代码,其中部分代码最初是用Fortran 77编写的,而大多数新开发都是用Fortran 95及以上版本编写的。其中还穿插了一些C代码和Python脚本。
英特尔开发人员指南明确提到End Subroutine已经启动了Return:https://software.intel.com/en-us/fortran-compiler-developer-guide-and-reference-end 另一方面,我记得在2000年代曾被教导过在END SUBROUTINE之前指定显式RETURN语句始终是个好习惯。
典型的子程序结构如下所示(例如,查普曼的“科学家和工程师的Fortran”第4版):
SUBROUTINE subroutine_name ( argument_list )
...
(Declaration section)
...
(Execution section)
...
RETURN
END SUBROUTINE [subroutine_name]

如果没有任何参数的返回语句不是一种好的实践,那么为什么要在结构中提及它,尤其是在“执行部分”之外?CYCLE或EXIT等从未被提及作为标准子程序结构的一部分。那么,为什么要使用RETURN?


1
我从不认为任何冗余的语法是良好的实践,但由于这是遗留代码,我不会更改任何我不必更改的内容。 - user207421
Intel断开了文档链接,所以这里提供一个截至本评论时间戳的可用版本:https://www.intel.com/content/www/us/en/docs/fortran-compiler/developer-guide-reference/2023-2/end.html - Jeff Hammond
2个回答

4
正如英特尔指南提到的那样,这是没有意义的,因为“结束子程序”语句已经处理了它。如果您需要在循环中返回,那么返回语句是有用的(但是也有一种观点认为应该结构化控制流程,以便您永远不会在循环中间返回。因人而异)。

2
值得一提的是,这取决于目标语言的版本(这就是为什么在遗留代码中看到这个)。RETURN(和等效的STOP)在Fortran 66及更早版本中是必需的。 - IanH

2
这是一种噪音。它只会分散有用代码的注意力,对编程没有任何帮助。经验不足的人可能会想知道它为什么存在。
这就像在“END PROGRAM”之前放置一个“STOP”。那样更糟糕,因为它会产生一些副作用,会使经验不足的程序员和程序用户感到困惑。
一些非常古老的Fortran版本(第66个标准)可能需要它,但那是计算机史前时期。

1
不太正确。Fortran 66,8.3.1 定义函数子程序...(6)函数子程序必须包含至少一个“RETURN”语句。8.4.1 定义子例程子程序...(5)子例程子程序必须包含至少一个“RETURN”语句。 - steve
注意,F77从F66中移除了对函数和子程序的要求。在函数或子程序中执行END语句与在该子程序中执行RETURN语句具有相同的效果。 - steve
应该检查一下文件。我记得有类似的东西,但是错过了确切的日期。 - Vladimir F Героям слава
现在我看到IanH甚至在评论中提到了它。 - Vladimir F Героям слава

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接