2011-10-29 8 views
6

Mam plik nagłówkowy, który deklaruje C API dla pewnej biblioteki i chciałbym utworzyć wiązania OCaml dla tej biblioteki. Zauważyłem, że camlidl może tworzyć kody pośredniczące z pliku IDL, ale jak rozumiem, nie ma automatycznej konwersji z pliku *.h na IDL, więc teraz zastanawiam się, czy istnieje inny sposób generowania kodu pośredniczącego dla wiązań OCaml z pliku nagłówkowego C?Generowanie wiązań programu Ocaml z pliku nagłówkowego C

Odpowiedz

6

W pliku nagłówkowym C jest za mało informacji, aby zapisać powiązania dla innego języka. W bardzo prostych przypadkach (na przykład, wszystkie funkcje przyjmują tylko liczby całkowite lub zmiennoprzecinkowe), jest to możliwe, ale gdy tylko zaangażują się wskaźniki, musisz podać więcej informacji: czy funkcja będzie odczytywana ze wskazanej wartości, napisz do tego, czy do obu? Czy interfejs musi zezwalać na zerowy wskaźnik? Czy w rzeczywistości jest to wskaźnik do tablicy i gdzie jest rozmiar? Czy to char* jest wskaźnikiem do zakończonego znakiem zero łańcucha?

IDL rozszerza deklaracje funkcji C o dodatkowe adnotacje, aby objąć wszystkie te punkty. Dlatego camlidl działa na IDL, a nie bezpośrednio na nagłówkach C. Nie znajdziesz niczego znacznie mniej bolesnego.

Istnieje jeszcze inne podejście, które polega na swobodnym przypisywaniu nagłówków C makrom, które mają puste rozwinięcie, ale dostarczają dodatkowych informacji o typie, np.

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

Takie adnotacje nie są wystandaryzowane, więc jeśli wybierzesz tę trasę, musisz napisać własne narzędzia. (Jeśli chcesz przetworzyć kod C, spójrz na Cil). Zamiast tego polecam traktować deklaracje IDL jako podstawowe i generować z nich pliki nagłówkowe C.

Powiązane problemy