Fortran标准和内在程序标准

时间:2016-09-15 17:41:19

标签: fortran

在GNU Fortran编译器的文档中,对于特定的内部函数,有一个标准。例如,CPU_TIME是一个内在过程,表明该标准是 Fortran 95及更高版本。我的问题是关于这个的含义。

我理解 Fortran标准就像要遵循一套规则,以便将代码定义为符合标准(对Fortran 77,90,95,2003或2008)。这是否意味着CPU_TIME只能与Fortran 95+一起使用?实际上,我已经知道了答案,我可以在带有.f扩展名的Fortran 77文件中使用CPU_TIME而无需编译器进行投诉,使用Gfortran版本进行编译>那是因为编译器能够处理代码中遇到的任何标准吗?我知道-std标志但我怎么能确定例如Fortran 77代码只使用Fortran 77的内部过程?

1 个答案:

答案 0 :(得分:2)

简短的回答,你无法区分f95以下的标准与gnu编译器。从f95及更高版本开始,您可以使用选项-std强制编译器将上述标准功能视为错误。

答案很长:

documentation of gnu compiler说:

  

-std = STD       指定程序预期符合的标准,可以是'f95','f2003','f2008','gnu'或'legacy'之一。该   std的默认值是'gnu',它指定了。的超集   Fortran 95标准,包括所支持的所有扩展   GNU Fortran,虽然会针对过时的扩展发出警告   不建议在新代码中使用。 “遗留”价值是等价的   但没有过时扩展的警告,可能会有用   对于旧的非标准程序。 'f95','f2003'和'f2008'值   指定严格符合Fortran 95,Fortran 2003和Fortran   2008标准分别;所有扩展都会出错   超出相关语言标准,并给出警告   Fortran 77功能允许但后来过时   标准。 '-std = f2008ts'允许Fortran 2008标准包括   增加了技术规范(TS)29113   Fortran与C和TS 18508在附加并行上的互操作性   Fortran的特色。

- `-std=f95` will consider features above f95 as errors
- `-std=f2003` will consider features above f2003 as errors
- `-std=f2008` will consider features above f2008 as errors
- etc.

您可能需要与其他编译器核对。

轻松验证:使用和不使用选项-std=f95编译以下程序(由Fortran wiki提供),看看会发生什么。

module class_Circle
    implicit none
    private
    real :: pi = 3.1415926535897931d0 ! Class-wide private constant

    type, public :: Circle
        real :: radius
    contains
        procedure :: area => circle_area
        procedure :: print => circle_print
    end type Circle
contains
    function circle_area(this) result(area)
        class(Circle), intent(in) :: this
        real :: area
        area = pi * this%radius**2
    end function circle_area

    subroutine circle_print(this)
        class(Circle), intent(in) :: this
        real :: area
        area = this%area()  ! Call the type-bound function
        print *, 'Circle: r = ', this%radius, ' area = ', area
    end subroutine circle_print
end module class_Circle


program circle_test
    use class_Circle
    implicit none

    type(Circle) :: c     ! Declare a variable of type Circle.
    c = Circle(1.5)       ! Use the implicit constructor, radius = 1.5.
    call c%print          ! Call the type-bound subroutine
end program circle_test