我有一个带有以下签名的C函数:
void init(int* argc, char** argv[]);
我想使用Ctypes从我的OCaml代码中调用此函数,但我无法找到将Sys.argv
传递给它的正确方法。
答案 0 :(得分:6)
这应该成为诀窍:
module OArray = Array
open Ctypes;;
open Foreign;;
let init =
foreign "init" (ptr int @-> ptr string @-> returning void)
let init a =
let argc = allocate int (OArray.length a) in
let argv = Array.of_list string (OArray.to_list a) in
init argc (Array.start argv)
let () = init Sys.argv
请注意,我们需要对OCaml的Array
模块进行处理,因为Ctypes
会覆盖它,这将在0.3中更改,请参阅this report。