2

我正在尝试实现一个简单的终结器,但我什至无法编译这个示例:

  MODULE m
   TYPE :: t1
    REAL a,b
   END TYPE
   TYPE, EXTENDS(t1) :: t2
    REAL,POINTER :: c(:),d(:)
    CONTAINS
    FINAL :: t2f
   END TYPE
   TYPE, EXTENDS(t2) :: t3
    REAL,POINTER :: e
    CONTAINS
    FINAL :: t3f
   END TYPE

   CONTAINS
   SUBROUTINE t2f(x) ! Finalizer for TYPE(t2)'s extra components
    TYPE(t2) :: x

    print *, 'entering t2f'  
    IF (ASSOCIATED(x%c)) then
     print *, ' c allocated, cleaning up'
     DEALLOCATE(x%c)
    end if 
    IF (ASSOCIATED(x%d)) then 
     print *, ' d allocated, cleaning up'
     DEALLOCATE(x%d)
    end if  
   END SUBROUTINE
   SUBROUTINE t3f(y) ! Finalizer for TYPE(t3)'s extra components
    TYPE(t3) :: y

    print *, 'entering t3f'
    IF (ASSOCIATED(y%e)) then
      print *, ' e allocated, cleanup up'
      DEALLOCATE(y%e)
    end if 
   END SUBROUTINE
END MODULE

使用 GNU Fortran (GCC) 4.8.2 20131212 (Red Hat 4.8.2-7) 给我这个错误输出:

$ gfortran -c m_example.f03 m_example.f03:5.26:

TYPE, EXTENDS(t1) :: t2 1 错误:(1) 处的最终确定尚未实现 m_example.f03:10.26:

TYPE, EXTENDS(t2) :: t3 1 错误:(1) 处的最终确定尚未实现

这是一个错误,是否意味着终结器尚未在 gfortran 中实现,或者我做错了什么?

4

1 回答 1

2

从 gcc 4.9 开始,终结器被识别。此外,如果您不自己实现它们,编译器似乎会自己生成终结代码。

不幸的是,这导致了错误 59765。我不幸发现,在 gcc gfortran 4.10 中仍然可用。

于 2015-01-17T12:54:41.540 回答