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