主程序中应该允许返回语句吗?
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 吗?