【发布时间】:2015-08-22 22:55:33
【问题描述】:
这个问题已经存在好几年了,但我从来没有听说过一个好的解决方案。
如果 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),但我怀疑这是编译器的问题。
有没有人理解这种行为背后的道理,或者更实际的解决方案?
编译器可以使用此信息来检查模块中定义的接口是否与实际子例程匹配。所以它比它可能的要差两个级别。忽视信息是错失良机;将其视为错误会适得其反。
【问题讨论】:
-
我也有同样的问题...因此,接口块无法检查定义本身是否正确>
-
如果您有一个子程序使用一个模块,该模块包含一个定义该子程序接口的接口块,那么它肯定不是编译器的错。你想做什么?
-
@francescalus 虽然我不知道 OP 的情况,但我只是对为什么“标准委员会”禁止这样做感兴趣(因为对我来说似乎没有充分的理由)。这很有用的一种情况是,从一个巨大的老式 Fortran 样式包(不包含在模块中)调用例程,并且希望确保相关子例程调用(尤其是新添加的子例程调用)的一致性。根据我的经验,一些仍在积极开发的电子结构代码就是用这种风格编写的(它甚至依赖于大量的 COMMON 块......嗯)。
-
@roygvib 这个问题和你的观点(在答案中包含)是合理的(尽管我觉得这个问题对于 +1 来说太“咆哮”了)。不过,这项禁令可以追溯到 F90,因此任何超出“标准如此规定”的细节都很难找到。如果我有很多外部程序单元,而 use 语句中的
only子句太麻烦,我可能会更担心。