从 Fortran 调用 C 语言

Fortran 2003 引入了语言功能,可以保证 C 和 Fortran 之间的互操作性(以及使用 C 作为中介的更多语言)。这些功能主要通过内部模块 iso_c_binding 访问:

use, intrinsic::iso_c_binding

此处的 intrinsic 关键字确保使用正确的模块,而不是用户创建的同名模块。

iso_c_binding 可以访问可互操作的类型参数:

integer(c_int) :: foo    ! equivalent of 'int foo' in C
real(c_float) :: bar     ! equivalent of 'float bar' in C

使用 C 类型参数可确保数据可在 C 和 Fortran 程序之间传输。

C char 和 Fortran 字符的互操作性本身可能是一个主题,因此这里不再讨论

要从 Fortran 实际调用 C 函数,首先必须声明接口。这基本上等同于 C 函数原型,并让编译器知道参数的数量和类型等 .bind 属性用于告诉编译器 C 中函数的名称,这可能与 Fortran 不同名称。

geese.h

// Count how many geese are in a given flock
int howManyGeese(int flock);

geese.f90

! Interface to C routine
interface
  integer(c_int) function how_many_geese(flock_num) bind(C, 'howManyGeese')
    ! Interface blocks don't know about their context,
    ! so we need to use iso_c_binding to get c_int definition
    use, intrinsic::iso_c_binding, only : c_int
    integer(c_int) :: flock_num
  end function how_many_geese
end interface

Fortran 程序需要链接到 C 库( 依赖于编译器,包括这里? ),其中包括 howManyGeese() 的实现,然后可以从 Fortran 调用 how_many_geese()