这个问题已经存在了几年,但我从来没有听说过一个很好的解决方案。
如果Fortran子例程包含一个带有自身接口的模块
subroutine stuff(nz,z,dt)
use allinterfaces
...
发生错误
错误:在(1)导入的模块'allinterfaces'的'stuff'也是当前程序单元的名称
为了解决这个问题,我必须申报
subroutine stuff(nz,z,dt)
use allinterfaces, except_this_one => stuff
...
这是荒谬的行为,因为我喜欢在模块中包含所有接口,所以很烦人。这不应该是编译错误,或者至少应该有except_itself
我使用的编译器是gfortran版本4.8.2(GCC),但我怀疑这是编译器的错误。
是否有人理解这种行为背后的理性,可能是误导,还是更实际的解决方案?
可能更荒谬的是编译器可以使用此信息来检查模块中定义的接口是否与实际子例程匹配。所以它比它可能的两个级别更糟糕。忽视这些信息是错失的机会;将它视为一个错误似乎是一个可怕的想法。
答案 0 :(得分:7)
此行为由Fortran标准指定。标准委员会讨论了放宽限制,称为"与自我接口,但最终拒绝了它。我不记得具体细节。由于标准禁止它,编译器必须能够诊断它,大多数都是默认的。
只有在尝试逐步更新F77样式的程序以使用显式接口时,才会遇到此问题。我注意到英特尔Fortran,也许还有gfortran,它有一个功能可以自动检查这些接口(在ifort它的“接口”)。
也许更好的方法是将您的程序放在模块中。