2011-10-29 39 views
6

我有一個頭文件爲某個庫聲明瞭一個C API,我想爲這個lib創建一個OCaml綁定。我發現camlidl可以從IDL文件創建存根,但據我所知,沒有從*.h文件自動轉換爲IDL,所以現在我想知道是否有任何其他方式從C頭文件爲OCaml綁定生成存根?從C頭文件生成Ocaml綁定存根

回答

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); 

這樣的註釋不是標準化的,所以如果你走這條路線,你必須編寫自己的工具。 (如果要解析C,請查找Cil)。我建議您將IDL聲明視爲主要對象,並根據它們生成C頭文件。