从C头文件生成Ocaml绑定存根

Nut*_*tel 6 ocaml idl

我有一个头文件,它为某个库声明了一个C API,我想为这个库创建一个OCaml绑定.我发现camlidl可以从IDL文件创建存根,但据我所知,没有从*.h文件到IDL的自动转换,所以现在我想知道是否还有其他方法可以从C头文件生成OCaml绑定的存根?

Gil*_*il' 6

C头文件中没有足够的信息来为另一种语言编写绑定.在非常简单的情况下(例如,所有函数只接受整数或浮点参数),这是可能的,但只要涉及指针,就需要提供更多信息:函数是否会从指向的值读取,写入对它,或两者兼而有之?接口是否必须允许空指针?这实际上是一个指向数组的指针,大小在哪里?这是char*一个指向零终止字符串的指针吗?

IDL使用额外注释扩展C函数声明以涵盖所有这些点.这就是为什么camlidl适用于IDL,而不是直接在C头上.你不会发现任何明显不那么痛苦的东西.

还有另一种方法,即使用具有空扩展但提供额外类型信息的宏来自由地注释C头,例如,

int memmove(void ANN_OUT ANN_SIZE(n) ANN_NOT_NULL *dest,
            const void ANN_IN ANN_SIZE(n) ANN_NOT_NULL *src,
            size_t n);
Run Code Online (Sandbox Code Playgroud)

这样的注释不是标准化的,所以如果你走这条路,你将不得不编写自己的工具.(如果要解析C,请查找Cil.)我建议您将IDL声明视为主要声明,并从中生成C头文件.