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