从 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()
。