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
模块可靠地确定数据布局