我注意到与gfortran(GNU Fortran(Debian 4.9.2-10)4.9.2)发生奇怪的链接错误,这取决于我在派生类型中定义成员的顺序。使用ifort(ifort(IFORT)18.0.1 20171018),代码可以按预期方式编译和运行。
module bug
implicit none
type indestructable
integer :: i
end type
type destructable
integer :: i
contains
final :: destruct
end type destructable
type compound
type(destructable) :: des
type(indestructable) :: ind
end type compound
contains
subroutine destruct(instance)
type(destructable), intent(in) :: instance
write(*,*) instance%i
end subroutine destruct
subroutine run
type(compound) :: cmp
cmp%des%i = 3
cmp%ind%i = 4
end subroutine run
end module bug
program main
use bug, only: run
implicit none
call run
end program main
该程序在完成时应打印出“ 3”,因为“ cmp”中的“ des”具有一个析构函数,该析构函数会写出其成员“ i”,该成员设置为3。
在gfortran中,编译器给出一个错误,即未定义复合类型的析构函数。该析构函数应自动生成,并调用所有成员的析构函数。问题在于复合类型中还有一个没有析构函数的类型的成员。从而以某种方式妨碍gfortran破坏者的组织。
通过将可破坏成员放在不可破坏成员之后(在化合物的类型定义内切换两行)来解决此问题。
有人知道这是否是在以后的版本中可以解决的编译器问题,还是我做错了什么,而ifort则以某种方式为我解决了这个问题。我一直了解到,定义成员变量的顺序无关紧要。
对于遇到相同问题的任何人:“始终将可破坏的成员放在最后”。但是,即使非派生类型都是可分配的,它们似乎也不重要。