在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的内部过程?
答案 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