ocaml ctypes
ocaml-ctypes 0.21.1
ctypes 是一個使用純 OCaml 綁定到 C 函式庫的函式庫。主要目標是使 C 擴充的編寫盡可能簡單。
ctypes 的核心是一組用於描述 C 類型結構的組合器——數字類型、陣列、指標、結構、聯合和函數。您可以使用這些組合器來描述要呼叫的函數的類型,然後直接綁定到這些函數 - 所有這些都無需編寫或產生任何 C!
假設您要綁定到下列 C 函數:
int sigemptyset ( sigset_t * set );
int sigfillset ( sigset_t * set );
int sigaddset ( sigset_t * set , int signum );
int sigdelset ( sigset_t * set , int signum );
int sigismember ( const sigset_t * set , int signum );
使用 ctypes,您可以描述這些函數的接口,如下所示:
let sigemptyset = foreign " sigemptyset " (ptr sigset_t @-> returning int )
let sigfillset = foreign " sigfillset " (ptr sigset_t @-> returning int )
let sigaddset = foreign " sigaddset " (ptr sigset_t @-> int @-> returning int )
let sigdelset = foreign " sigdelset " (ptr sigset_t @-> int @-> returning int )
let sigismember = foreign " sigismember " (ptr sigset_t @-> int @-> returning int )
此程式碼綁定的名稱具有您可能期望的類型:
val sigemptyset : sigset_t ptr -> int
val sigfillset : sigset_t ptr -> int
val sigaddset : sigset_t ptr -> int -> int
val sigdelset : sigset_t ptr -> int -> int
val sigismember : sigset_t ptr -> int -> int
這就是全部內容了。與編寫 C 擴展的通常方法不同,無需編寫 C“存根”函數,因此出錯的機會要少得多。
文件和原始碼分發包含更複雜的範例,涉及結構、聯合、陣列、回調函數等,並展示如何在 OCaml 中建立和使用 C 值(如sigset_t ptr
的實例)。
Cstubs_structs
模組可靠地確定資料佈局