2011-10-29 9 views
6

Ho un file di intestazione che dichiara un'API C per qualche libreria e vorrei creare un binding OCaml per questa libreria. Ho scoperto che Camlidl può creare stub da un file IDL ma, come ho capito, non esiste alcuna conversione automatica da un file *.h a IDL, quindi ora mi chiedo se c'è un altro modo per generare stub per i binding OCaml da un file di intestazione C?Genera gli stub dei binding di Ocaml dal file di intestazione C

risposta

6

Non ci sono abbastanza informazioni in un file di intestazione C per scrivere associazioni per un'altra lingua. In casi molto semplici (ad esempio, tutte le funzioni accettano solo argomenti interi o in virgola mobile), è possibile, ma non appena vengono coinvolti i puntatori, è necessario fornire ulteriori informazioni: la funzione legge dal valore puntato, scrive ad esso, o entrambi? L'interfaccia deve consentire un puntatore nullo? Questo è in realtà un puntatore a un array, e dov'è la dimensione? Questo è char* un puntatore a una stringa a terminazione zero?

IDL espande le dichiarazioni di funzione C con annotazioni aggiuntive per coprire tutti questi punti. Ecco perché camlidl funziona su IDL e non direttamente sulle intestazioni C. Non troverai nulla di significativamente meno doloroso.

C'è un altro approccio, che è quello di annotare liberamente le intestazioni C con macro che hanno un'espansione vuota ma forniscono informazioni di tipo extra, ad es.

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

Tali annotazioni non sono standardizzate, quindi se segui questo percorso dovrai scrivere i tuoi strumenti. (Cercare Cil se si desidera analizzare C.) Si consiglia invece di considerare le dichiarazioni IDL come primarie e di generare da esse i file di intestazione C.

Problemi correlati