接口文件的自动一致性检查

时间:2013-02-21 09:46:35

标签: interface static-libraries fortran90

我想在Fortran90中创建一个库,并认为这样做的好方法是在文件interface.f90(没有模块)中收集公共例程,编译并将所有内容收集到“.a”中静态库,并维护一个文件interface.inc,其接口块对应于interface.f90中的例程。 然后我将.a文件与interface.inc一起分发,这样用户就可以在编译时使用“include'interface.inc'”进行类型检查。

问题在于,在开发库时,每次公共例程的界面发生变化时,都必须在两个地方手动进行:interface.f90和interface.inc。 最好的情况是interface.inc可以在库的编译中从interface.f90自动生成,但到目前为止我还没有找到标准化的方法。

然而,只要在编译库时捕获到任何不一致,手动更改interface.inc是可以接受的。 所以我要问的是:有没有办法自动检查interface.inc中接口块的一致性(编译库时)和interface.f90中的实际例程?

1 个答案:

答案 0 :(得分:1)

在Fortran 90中没有语言意义。特定处理器可能会将其作为诊断功能提供,但不需要它们。

在自动界面生成方面 - 我所知道的一个具有合适命令行选项的处理器(Intel Fortran)将为它遇到的每个外部过程写出接口块。它使用它来进行外部程序的接口检查。我看到一些用户为了类似的原因收获了这些接口块。这依赖于非常特定于处理器的行为,并且该行为的变化有时会偶尔破坏这种安排。

在Fortran 2003中,存在一致性检查的可能性。该方法在一个单独的模块声明基于接口块的过程指针。然后,在每个实际过程中,使用带有过程指针的模块和(可能在调试if构造或类似内部)尝试将该相关过程指针与实际过程相关联。编译器不需要诊断过程指针显式接口中的不匹配,但大多数应该。请参阅this forum thread末尾的帖子进行一些讨论(注意F2008标准中的错误,正式“未能为程序指针赋值提供解释”,但我认为这将在更正二中得到纠正)。

在将接口块打包给最终用户方面,请考虑将它们放在模块中并提供该模块的源。这将为您将来为用户提供更多灵活性。

MODULE interfaces
  IMPLICIT NONE
  PRIVATE
  PUBLIC :: external
  INTERFACE
    SUBROUTINE external(arg)
      IMPLICIT NONE
      INTEGER, INTENT(IN) :: arg(:)
    END SUBROUTINE external
  END INTERFACE
END MODULE interfaces

MODULE proc_pointers
  USE interfaces
  IMPLICIT NONE
  PRIVATE
  LOGICAL, PARAMETER, PUBLIC :: check_flag = .TRUE.
  PROCEDURE(external), POINTER, PUBLIC :: external_pptr
END MODULE proc_pointers

SUBROUTINE external(arg)
  USE proc_pointers
  IMPLICIT NONE
  INTEGER, INTENT(IN) :: arg(:)
  IF (check_flag) external_pptr => external
  ...    
END SUBROUTINE external