Fortran 主程序中是否应该允许return语句?

Fortran 主程序中是否应该允许return语句?,fortran,Fortran,我发现gfortran允许在fortran的主程序中使用return语句,但ifort不允许这样做,从而导致编译错误 我不理解为什么ifort不喜欢主程序中的return语句,因为当我想在程序到达最后一行代码之前完成执行时,return非常有用。 ifort是否建议提前终止主程序的更好方法。停了吗 此gfortran行为是否为非标准扩展,将过程返回的使用扩展到主程序?您已经回答了自己的问题-这是一个非标准扩展: ian@eris:~/work/stack$ cat ret.f90 Program

我发现gfortran允许在fortran的主程序中使用return语句,但ifort不允许这样做,从而导致编译错误

我不理解为什么ifort不喜欢主程序中的return语句,因为当我想在程序到达最后一行代码之前完成执行时,return非常有用。 ifort是否建议提前终止主程序的更好方法。停了吗


此gfortran行为是否为非标准扩展,将过程返回的使用扩展到主程序?

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

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标志,以及与其他编译器等效的标志


正如您所说,停止是退出主程序的方式。

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

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返回stmt是返回[scalar int expr]

C1575 R1542返回stmt应在函数或子程序的包含范围内

约束C1575精确地给出了ifort使用的禁止。作为任何Fortran编译器,都必须能够检测并报告程序员的这种违规行为,但编译器可能会选择以某种未定义的方式允许这种违规行为。伊恩·布什(Ian Bush)向我们展示了如何让格弗特兰(gfortran)抱怨这种返回的无效使用

重复:是的,停止和错误停止通过终止程序的执行从主程序返回操作系统。在某些设置中也可以使用非标准语句,但我建议您避免使用非标准语句,就像避免在主程序中返回一样。

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

R1542返回stmt是返回[scalar int expr]

C1575 R1542返回stmt应在函数或子程序的包含范围内

约束C1575精确地给出了ifort使用的禁止。作为任何Fortran编译器,都必须能够检测并报告程序员的这种违规行为,但编译器可能会选择以某种未定义的方式允许这种违规行为。伊恩·布什(Ian Bush)向我们展示了如何让格弗特兰(gfortran)抱怨这种返回的无效使用


重复:是的,停止和错误停止通过终止程序的执行从主程序返回操作系统。在某些设置中也可能使用非标准设置,但我建议您避免使用非标准设置,就像避免在主程序中返回一样。

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