【问题标题】:Fortran interface to itself produces annoying errorFortran 接口本身会产生烦人的错误
【发布时间】: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 子句太麻烦,我可能会更担心。

标签: fortran gfortran


【解决方案1】:

此行为由 Fortran 标准指定。标准委员会讨论了放宽限制,称为“接口到自我”,但最终拒绝了。我不记得具体的了。由于标准禁止它,编译器必须能够诊断它,并且大多数默认情况下都会这样做。

只有在尝试增量更新 F77 样式程序以使用显式接口时才会遇到此问题。我会注意到英特尔 Fortran,也许还有 gfortran,有一个功能会自动为您检查这些接口(在 ifort 中是 -warn 接口)。

也许更好的方法是将您的过程放在模块中。

【讨论】:

  • 谢谢!似乎最近的 Fortran 标准已经变得痴迷于模块,这疏远了传统的 Fortran 程序员。为什么我们现在必须将所有内容包装在模块中?对于 gfortran,我只能找到 -Wimplicit-interface 和 -Wimplicit-procedure 作为相关的编译器选项。
  • 将程序转换为模块是一个相对简单的过程,并且可以更容易地诊断由于调用子程序或函数不正确引起的问题。我认为您在原始帖子中尝试做的事情与对已弃用的编码风格的痴迷有关。
猜你喜欢
  • 1970-01-01
  • 2012-03-11
  • 2019-08-17
  • 1970-01-01
  • 2016-05-01
  • 2011-10-21
  • 2013-03-01
  • 1970-01-01
  • 2014-05-20
相关资源
最近更新 更多