指定子程序接口的模块

Module specifying subroutine interfaces

我的库有为某些子程序指定抽象接口的模块,像这样:

module abstract_module
    implicit none

    ! interface of subroutines
    abstract interface
        subroutine sub_interface(...)
           ...
        end subroutine
    end interface

end module

现在在我的程序中我写了一个子程序,为了正确使用它,我必须声明它并且它工作得很好:

program testsub
    use abstract_module
    ...
    implicit none

    ! custom interface
    procedure(sub_interface) :: custom

    ! call the subroutine via another one
    call test_call(custom)
end program

现在我想将所有自定义子例程收集到一个模块中,但我不知道如何指定一个子例程实际上是依附于一个接口:

module custom_subs
    use abstract_module
    implicit none

    ! this does not compile, obviously
    abstract interface
        procedure(sub_interface) :: custom
    end interface

contains

subroutine custom(...)
   ...
end subroutine

end module

有没有办法像我在程序中所做的那样在模块中指定子例程,还是必须将它们留在程序本身中?

您有一堆外部过程,您希望在使用它们时为它们提供显式接口。您正在考虑两种方法:

  • 使用界面块
  • 制作程序本身模块程序

这是两种不同的且不兼容的方法。您必须选择其中之一;您不能将它们混合用于同一程序。

将外部过程转换为模块过程是一个值得称赞的目标。考虑模块

module custom_subs
  implicit none

contains

  subroutine custom(...)
     ...
  end subroutine

end module

也就是说,只需将程序放入模块中:不用担心使用其他 abstract_module 模块或添加接口块。实际上,销毁 abstract_module - 您不再将 custom 作为外部过程,因此它的接口将无法解析。

这个答案只是为了解决关于这些方法是否互补的困惑。可以在其他问题中找到有关每种方法的更多详细信息,例如 this one and this one.