这个问题已经存在了几年,但我从来没有听说过这个问题的好方法.
如果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),但我怀疑这是编译器的错.
有没有人理解这种行为背后的理性,可能是误导,还是更实际的解决方案?
或许更荒谬的是,编译器可以使用此信息来检查模块中定义的接口是否与实际子例程匹配.所以它比它可能的两个级别更糟糕.忽视这些信息是错失的机会; 将它视为一个错误似乎是一个可怕的想法.
此行为由Fortran标准指定.标准委员会讨论了放宽限制,称为"与自我的接口",但最终拒绝了它.我不记得具体细节了.由于标准禁止它,编译器需要能够诊断它,大多数都是默认的.
只有在尝试逐步更新F77样式的程序以使用显式接口时,才会遇到此问题.我会注意到英特尔Fortran,也许还有gfortran,它有一个功能可以自动检查这些接口(在ifort它的警告界面).
也许更好的方法是将您的程序放在模块中.
| 归档时间: |
|
| 查看次数: |
720 次 |
| 最近记录: |