为 Fortran 2003 代码声明旧 F77 函数和子例程的类型

Declaring types of old F77 functions and subroutines for Fortran 2003 code

我们有一个新的 Fortran 2003 代码,它调用并链接到 Fortran 77 库(在外部包中)。有没有办法在F2003的外部库中为F77函数和子程序编写声明,以确保在使用错误的参数类型调用函数时给出错误消息?一种方法是为每个函数编写包装器,但这似乎需要很多工作。

(顺便说一句,F77代码实际上是调用C代码的包装器。理想情况下,在F2003中重写C包装器会更好,但这也是很多工作)。

intel 编译器 ifort 有选项 -gen-interfaces。我认为此选项正是您所需要的。 与 gfortran 编译器(遗憾的是它没有此功能)不同,ifort 需要花钱, 或许您可以找人 运行 ifort -gen-interfaces 一次来获取您真正老旧的 fortran77 东西? 我假设fortran77代码不再变化,所以可以使用生成的*__genmod.f90 并且不必一次又一次地生成。

另一种方法是制作一个模块:

     MODULE NOSTALGIA77
     CONTAINS
       include 'file1.f'
      ...
       include 'fileN.f'
     END MODULE NOSTALGIA77

现在当你编译模块而不是单独的文件时,你可以使用函数和子程序 在您的 Fortran2003 代码中添加 USE NOSTALGIA77 之后,编译器将检查您的调用的正确性。

注意:该示例假定 fortran77 代码仅包含子例程。如果它还包含其他东西 (BLOCK DATA 和其他我们不想记住的东西),模块可能制作起来有点困难,因为 有些东西会出现在 CONTAINS 之前,有些会出现在 CONTAINS 之后。但它仍然可以完成(而且不会花费太多时间)。

祝你好运!


编辑:

也许 https://shroud.readthedocs.io/en/latest/ can help you. I did a few small tests (see https://shroud.readthedocs.io/en/latest/appendix-A.html)。 似乎可行的是将几行头文件放入 yaml 文件 clibrary.yaml,每行前面都有 '-decl':

declarations:
- decl: void NoReturnNoArguments()
- decl: double PassByValue(double arg1, int arg2)

我想这个 yaml 文件可以使用 sed、awk、python 或您喜欢的任何脚本语言从您的头文件轻松构建。 接下来,所有你 运行 都是裹尸布 clibrary.yaml,然后会出现一个 fortran 模块 libray_mod,你可以包含它,然后你的所有功能都可用,并测试它们的用法。