主程序中应该允许返回语句吗?

Posted

技术标签:

【中文标题】主程序中应该允许返回语句吗?【英文标题】:Should return statement be allowed in main program? 【发布时间】:2021-01-20 02:31:12 【问题描述】:

我发现gfortran允许在fortran主程序中使用return语句,但是ifort不允许这样做,编译出错。

我不明白ifort为什么不喜欢主程序中的return语句的原因,考虑到return在我想在程序到达最后一行代码之前完成执行时很有用。 ifort 是否推荐更好的方法来提前终止主程序。是stop吗?

这种 gfortran 行为是否是非标准扩展,它将return 的使用从程序扩展到主程序?

【问题讨论】:

【参考方案1】:

您已经回答了自己的问题 - 这是一个非标准扩展:

ian@eris:~/work/stack$ cat ret.f90
Program ret
  Implicit None
  Return
End Program ret
ian@eris:~/work/stack$ gfortran-10 --version
GNU Fortran (GCC) 10.0.1 20200225 (experimental)
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ian@eris:~/work/stack$ gfortran-10 ret.f90
ian@eris:~/work/stack$ gfortran-10 -Wall -Wextra -fcheck=all -std=f2008 ret.f90 
ret.f90:3:8:

    3 |   Return
      |        1
Error: GNU Extension: RETURN statement in main program at (1)

如果您想要可移植性和标准一致性(并且都应该),我强烈建议您始终在 gfortran 上使用 -std 标志,并且它与其他编译器等效。

正如你所说,stop 是退出主程序的方式。

【讨论】:

【参考方案2】:

主程序内不允许使用return 语句(内部子程序内除外)。这可以通过查看 Fortran (Fortran 2018, 15.6.2.7) 的语法规则来看出:

R1542 return-stmt 是 RETURN [ scalar-int-expr ]

C1575 (R1542) return-stmt 应在函数或子程序子程序的包含范围内。

约束 C1575 正好给出了 ifort 使用的禁止。作为numbered constraint,任何 Fortran 编译器都必须能够检测并报告程序员的这种违规行为,但编译器可能会选择允许它(以某种未定义的方式)。 Ian Bush 展示了如何要求 gfortran 抱怨这种对 return 的无效使用。

再重复一遍:是的,stop(和error stop)通过终止程序的执行从主程序“返回”(返回到操作系统)。 (非标准的exit function/subroutine 也可以在某些设置中使用,但我建议您避免这种情况,就像在主程序中避免使用return 一样。)

【讨论】:

关于错误停止的好点 - 我忘记了 stop 还会终止与主程序线程并行运行的任何线程,以防您使用 OpenMP。当然,这样的线程也可以使用return 的方法(例如,如果设置了标志变量),但在某些情况下使用stop 很方便,因为知道这将终止所有线程。

以上是关于主程序中应该允许返回语句吗?的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用操作扩展的共享扩展吗?

没有匹配的配置文件允许应用程序(但有一个配置文件应该允许它)

用户 App Entity User 没有用户提供程序 您的用户提供程序的 supportsClass() 方法不应该为这个类名返回 true 吗?

JDBC批量处理

这个小程序在冰茶 JRE 中有效吗?

基本级别的 Java 程序。缺少返回语句异常