0

我想在 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 中的实际例程的一致性(编译库时)?

4

1 回答 1

1

在 Fortran 90 中不是语言意义上的。特定处理器可能会提供此功能作为诊断功能,但它们不是必需的。

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

在 Fortran 2003 中,可能存在进行一致性检查的可能性。该方法是在一个单独的模块中声明基于接口块的过程指针。然后,在每个实际过程中,将模块与过程指针一起使用,并(可能在调试 if 构造或类似结构中)尝试将相关过程指针与实际过程相关联。编译器不需要诊断过程指针显式接口中的不匹配,但大多数都应该。请参阅此论坛帖子末尾的帖子以进行一些讨论(请注意,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
于 2013-02-21T22:57:05.240 回答