return 语句应该在主程序中被允许吗?

Should return statement be allowed in main program?

我发现gfortran在fortran的主程序中允许return语句,但是ifort不允许这样,编译报错

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

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

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

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是退出主程序的方法。

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

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

C1575 (R1542) The return-stmt shall be in the inclusive scope of a function or subroutine subprogram.

约束条件C1575准确给出了ifort使用的禁令。作为 任何 Fortran 编译器都必须能够检测并报告程序员的此类违规行为,但编译器可能会选择允许它(以某种未定义的方式)。 Ian Bush 展示了如何要求 gfortran 抱怨 return.

的这种无效使用

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